Text box

Résolu
Utilisateur anonyme -  
cs_Le Pivert Messages postés 8437 Statut Contributeur -
Bonjour
en vb.net j'utilise un text box dans lequel je dois saisir un nombre (double)
si je mets dans le code du text box

if isNuméric(Textbox.Text)=false then msgbox(« entrez seulement des chiffres »)


dès que je rentre la première lettre du mot que je veux entrer(par exemple le a de are ) il m'affiche le msgbox ; si je rentre 12 il ne dit rien mais si je rentre12.5 dès que je tape le . il m'affiche la msgbox>

Comment régler ce pb
A l’avance merci

5 réponses

  1. Utilisateur anonyme
     
    Bonjour
    sur ton PC le symbole décimal est il le . ou la , ?
    0
  2. Utilisateur anonyme
     
    encore merci
    dans le panneau de config il est sur virgule donc tu as raison quand je tape . il le prend pour du texte
    je peux le mettre avec le point et là cà marche
    c'était tout bête
    un peu d'humour
    encore une fois tu as raison c'est rageant ; j'avais cherché mais en vain
    donc pb résolu
    0
  3. Utilisateur anonyme
     
    Alors pour éviter ce soucis récurent, au lieu de IsNumeric, utlise Double.TryParse. Il y a une surcharge dans laquelle tu peux préciser la culture.
    Dans ton cas, ton pc est en culture française mais tu veux saisir un nombre en culture américaine (comme windows c’est américain, c’est la culture Default).
    Tu peux aussi faire une bidouille (si tu estimes que jamais l’utilisateur ne taperras un nombre avec la virgule comme séparateur des milliers) tu fournis au trypparse le texte dans lequel , est remplacé par . et tu dis que la culture est default.
    Enfin tu peux t’amuser à detecter les cultures (avec des regex par exemple) et parser selon celle-ci.

    Cette question revenant souvent, je pense poster un petit source exemple
    0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. Utilisateur anonyme
     
    Voila
    https://codes-sources.commentcamarche.net/faq/11316-conversion-de-string-en-nombre-en-net-c-et-vb-net

    c'est le 1er jet, n'hésitez ni l'un ni l'autre à me remonter des erreurs, des formulations trop nébuleuses ou de fautes d'orthographe.
    0
    1. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      Très intéressant. Par contre il faudrait que tu indiques que toutes les fonctions doivent être mises dans le module comme ceci:

      Option Strict On
      Imports System.Globalization
      Imports System.Text.RegularExpressions
      Friend Module Extensions
          ''' <summary>
          ''' Tente de convertir une string en double sans se poser de question
          ''' </summary>
          ''' <param name="Texte"></param>
          ''' <returns>Le double si c'est possible, Not A Number dans le cas contraire</returns>
          <System.Runtime.CompilerServices.Extension()>
          Public Function ToDoubleBasique(ByVal Texte As String) As Double
              Dim nombre As Double
              If Double.TryParse(Texte, nombre) Then
                  Return nombre
              Else
                  Return Double.NaN
              End If
          End Function
          ''' <summary>
          ''' Tente de convertir un texte au format #######.#### ou #######,##### en remplaçant la virgule par le point et en forçant la culture par défaut (Invariant Culture)
          ''' </summary>
          ''' <param name="Texte"></param>
          ''' <returns>Le double si c'est possible, Not A Number dans le cas contraire</returns>
          <System.Runtime.CompilerServices.Extension()>
          Public Function ToDoubleGereSymboleDecimal(ByVal Texte As String) As Double
              Dim nombre As Double
              If Double.TryParse(Texte.Replace(","c, "."c), NumberStyles.Number, CultureInfo.InvariantCulture, nombre) Then
                  Return nombre
              Else
                  Return Double.NaN
              End If
          End Function
          ''' <summary>
          ''' Tente de déterminer si le texte représente un nombre et de le convertir en double le cas échéant
          ''' </summary>
          ''' <param name="Texte"></param>
          ''' <returns>Le double si c'est possible, Not A Number dans le cas contraire</returns>
          <System.Runtime.CompilerServices.Extension()>
          Public Function ToDouble(ByVal Texte As String) As Double
              Dim culture As CultureInfo = CultureInfo.InvariantCulture
      
              If Regex.IsMatch(Texte, "^\d{1,3}( ?\d{3})*([\.,](\d{3} ?)*\d{1,3})?$") Then 'teste avec une regex qui cherche un nombre représenté avec ou sans espace comme séparateur des milliers et soit le point soit la virgule comme séparateur décimal
                  Texte = Texte.Replace(","c, "."c).Replace(" ", "") 'on enlève les espaces éventuels et on force le. en symbole décimal
              ElseIf Regex.IsMatch(Texte, "^\d{1,3}(,?\d{3})*(\.(\d{3},?)*\d{1,3})?$") Then 'teste avec une regex qui cherche un nombre représenté avec ou sans virgule comme séparateur des milliers et le point comme séparateur décimal
                  Texte = Texte.Replace(",", "") 'on enlève les espaces virgules
              End If
              'si on connait une autre culture il faut faire un autre else if avec une regex adaptée
      
              Dim nombre As Double
              If Double.TryParse(Texte, NumberStyles.Number, CultureInfo.InvariantCulture, nombre) Then
                  Return nombre
              Else
                  Return Double.NaN
              End If
          End Function
      End Module
      Public Class Form1
          Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
              'lesNombres est une liste de double
              ListBox1.Items.Add("123.4".ToDoubleBasique())   'ajoute 123.4 si le symbole décimal du PC est le point et NaN dans le cas contraire
              ListBox1.Items.Add("123,4".ToDoubleBasique())   'ajoute 123.4 si le symbole décimal du PC est la virgule et NaN dans le cas contraire
              ListBox1.Items.Add("1 234".ToDoubleBasique())   'ajoute 1234.0 si la culture est française et NaN dans le cas contraire
              ListBox1.Items.Add("1 234,1".ToDoubleBasique()) 'ajoute 1234.1 si la culture est française et NaN dans le cas contraire
              ListBox1.Items.Add("1,234.1".ToDoubleBasique()) 'ajoute 1234.1 si la culture est américaine et NaN dans le cas contraire
          End Sub
          Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
              ListBox1.Items.Add("123.4".ToDoubleGereSymboleDecimal())   'ajoute 123.4 quelque soit le symbole décimal du PC
              ListBox1.Items.Add("123,4".ToDoubleGereSymboleDecimal())   'idem
              ListBox1.Items.Add("1 234".ToDoubleGereSymboleDecimal())   'ajoute NaN quelque soit le symbole décimal du PC
              ListBox1.Items.Add("1 234.1".ToDoubleGereSymboleDecimal()) 'idem
              ListBox1.Items.Add("1 234,1".ToDoubleGereSymboleDecimal()) 'idem
              ListBox1.Items.Add("1,234.1".ToDoubleGereSymboleDecimal()) 'idem
          End Sub
          Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
              ListBox1.Items.Add("123.4".ToDouble()) 'ajoute 123.4 quelque soit le symbole décimal du PC
              ListBox1.Items.Add("123,4".ToDouble()) 'idem
              ListBox1.Items.Add("1 234".ToDouble()) 'ajoute 1234.0 quelque soit la culture du PC
              ListBox1.Items.Add("1 234.1".ToDouble()) 'ajoute 1234.1 quelque soit la culture du PC
              ListBox1.Items.Add("1 234,1".ToDouble()) 'idem
              ListBox1.Items.Add("1 234.1".ToDouble()) 'idem
              ListBox1.Items.Add("1,234.1".ToDouble()) 'idem
              ListBox1.Items.Add("1,234,456".ToDouble()) 'ajoute 123456.0 quelque soit la culture du PC
          End Sub
      End Class
      


      a moins que j''ai zappé cela

      Beau travail

      ps ton tuto est dans C mais pas dans VB.Net!

      @+ Le Pivert
      0
    2. Utilisateur anonyme
       
      J'ai mis
      Je donnerai le contenu du fichier complet pour le premier exemple, pour les suivants, ce sera juste la nouvelle méthode
      dans l'intro, mais je peux le remettre au fur et à mesure pour plus de clarté.
      VB95 m'a dit la même chose pour NaN

      Et oui je l'ai mis dans C# même si je présente aussi le code en VB.NET, parce que ça me gonfle de le faire en double.
      0
    3. Utilisateur anonyme
       
      Voilà c.est fait
      0
    4. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      Merci

      En VB.Net (à ajouter dans le module)

      C'est plus clair comme cela

      @+ le Pivert
      0