Text box

Résolu
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. Bonjour
    sur ton PC le symbole décimal est il le . ou la , ?
    1. 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
      1. 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
        1. 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.
          1. Contributeur
            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
          2. 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.
          3. Voilà c.est fait
          4. Contributeur
            Merci

            En VB.Net (à ajouter dans le module)

            C'est plus clair comme cela

            @+ le Pivert