Text box

Résolu/Fermé
Utilisateur anonyme - 13 nov. 2018 à 08:09
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 - 14 nov. 2018 à 13:31
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
A voir également:

5 réponses

cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
13 nov. 2018 à 08:23
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
13 nov. 2018 à 11:18
Bonjour
sur ton PC le symbole décimal est il le . ou la , ?
0
Utilisateur anonyme
13 nov. 2018 à 11:35
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
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
13 nov. 2018 à 12:02
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
13 nov. 2018 à 22:03
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
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
Modifié le 14 nov. 2018 à 10:05
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
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
14 nov. 2018 à 11:52
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
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
14 nov. 2018 à 12:11
Voilà c.est fait
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
14 nov. 2018 à 13:31
Merci

En VB.Net (à ajouter dans le module)

C'est plus clair comme cela

@+ le Pivert
0