IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Test si un champ est numérique : avec "," , avec "." la bonne instruction.


Sujet :

VB.NET

  1. #1
    Membre du Club
    Homme Profil pro
    Tooling - Testing
    Inscrit en
    Décembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Tooling - Testing

    Informations forums :
    Inscription : Décembre 2008
    Messages : 141
    Points : 65
    Points
    65
    Par défaut Test si un champ est numérique : avec "," , avec "." la bonne instruction.
    Bonsoir ... j'espère que tout le monde n'est pas en vacances


    J'exécute une application VBNet dans laquelle je teste si un champ est numérique ou non.

    Si je teste de cette manière ( IsNumeric ne semble pas convenir ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Dim Value As Double
    Text = "0,a"
    If Double.TryParse(Text, Value) Then
      message "pas de valeur numérique"
    End if
    '
    Text = "0,6"
    If Double.TryParse(Text, Value) Then
      message "valeur numérique"
    End if
    '
    Text = "0,a"
    If Double.TryParse(Text, Value) Then
      message "pas de valeur numérique"
    End if
    '
    Text = ",6"
    If Double.TryParse(Text, Value) Then
      message "valeur numérique"
    End if
    '

    Ceci tend à prouver que je me retrouve dans un environnement où c'est la virgule qui commence la partie décimale.
    Déjà je ne sais pas comment tester cela, et de quoi cela dépend il ? D'un switch quelque part, de ma localisation vue par Windows,
    est il toujours le même pour toutes les applications que j'utilise sur mon ordinateur ? Excel, VBNet, ....

    Maintenant comment tester si un champ que je recevrais de l'extérieur ( donc cela ne dépend pas de moi ) est numérique mais qui aurait le point comme séparateur?
    Le test ne fonctionne plus et donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    '
    Text = "1.6"
    If Double.TryParse(Text, Value) Then
      message "valeur non numérique"
    End if
    '

    Je dois utiliser ceci ( dont je ne comprends pas encore toute la syntaxe ) ( mais je vais m'y mettre )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    '
    Dim Text As String = "15.6"
    If Double.TryParse(Text, Globalization.NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, Value) Then
       message "valeur numérique"
    Else
       message "valeur non numérique"
    End If
    Comment faire un seul test pour voir si un champ est numérique avec "," ou avec "." ?
    Ou dois je faire deux tests successifs?

    Merci de vos pistes.

    Pierre

  2. #2
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 172
    Points
    17 172
    Par défaut
    Salut

    Par principe, une entrée numérique externe ou utilisateur, je fais un Replace , par . puis seulement après je vérifie avec IsNumeric, car IsNumeric ne sera True que si un . est le séparateur décimale, quelque soit la source du pays.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  3. #3
    Membre du Club
    Homme Profil pro
    Tooling - Testing
    Inscrit en
    Décembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Tooling - Testing

    Informations forums :
    Inscription : Décembre 2008
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    Merci. Je comprends la démarche, mais le champ testé fait partie, par exemple d'un fichier CSV qui peut contenir

    Code CSV : Sélectionner tout - Visualiser dans une fenêtre à part
    "record 1", "nom,adresse","57","rue de la station", "identifiant", "1233.2112", "montant", "123,45", ...............
    Cela devient compliqué
    En me relisant, il me semble que je devrais faire une nouvelle analyse des cas possibles et de la manière de décoder cela. Je répète qu'il s'agit de fichiers CSV avec séparateur inconnu au départ, ( , ou | ou ; .... ) et avec " ou sans " aux bordures des champs

    et suivant ceci "IsNumeric ne sera True que si un . est le séparateur décimale, quelque soit la source du pays." Mon test me donne valeur numérique OK si le champ contient 15,6 true !! ( et non 15.6)

    Pierre

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Points : 293
    Points
    293
    Par défaut
    j'ai travaillé ce problème il y a quelques temps, pour ma part j'utilise toujours la virgule comme séparateur dans mes nombres. dans un fichier csv avec une virgule pour diviser les colonnes je j'arrive à les diviser quand il sont entourés de "". Pour ce faire j'utilise le regex. D'ailleurs, vite comme ça ce que je ferais pour tester si une variable est numérique j'utiliserais cette logique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim Val1 As String = "1.25"
            Dim Tmp As String = Val1 'Parce que je veux pas changer ma val1
            If Tmp.Contains("."c) Then
                Tmp = Tmp.Replace(".", ",")
                If IsNumeric(Tmp) Then
                    'Valeur numerique
                End If
            End If
    ainsi tu tests les points et les virgules

  5. #5
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour,

    Idéalement, lorsqu'on utilise un fichier CSV, on doit connaître l'ordre et la signification des champs. On peut ainsi distinguer facilement les numériques dont on a besoin. Il est courant que la première ligne du fichier contienne seulement les noms des champs et en la lisant, on sait tout du reste du fichier.

    Perso, vu que tu es confronté à des chaines diverses (puisqu'elles viennent d'un CSV), avec point, avec virgule, numérique ou non, et que (si je comprends bien) tu veux distinguer les numériques des non numériques, je placerais la chaine à tester dans une variable temporaire (pour ne pas détruire la valeur initiale) et je ferais sur cette variable, le remplacement de la virgule par le point. C'est seulement ensuite que je testerais la variable temporaire pour savoir si elle est numérique ou non. Si elle l'est, la valeur initiale est donc numérique et je dois remplacer son éventuelle virgule par un point. Si la temporaire n'est pas numérique, je ne touche pas à la valeur initiale.

    Par exemple (je ne l'ai pas encodé sous VB, donc bug possible) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
     
    ' ValeurDuCSV, la valeur à tester
     
    Dim VariableTmp AS String = ValeurDuCSV.Replace(",",".")
     
    Try 
       Dim VariableNumeriqueTmp As Double = CType(VariableTmp, Double)
    Catch
       VariableTmp = String.Empty
    End Try
     
    ' ici, on décide de ce qu'on veut faire avec ValeurDuCSV qui a toujours sa valeur initiale
     
    If VariableTmp = String.Empty Then
            ' =======> ValeurDuCSV n'est pas numérique
            ' Je garde ValeurDuCSV inchangée
    Else
            ' =======> ValeurDuCSV est  numérique
            ValeurDuCSV = VariableTmp   ' en lui affectant cette valeur, on modifie ValeurDuCSV en lui mettant un point à la place de l'éventuelle virgule
    End if
    J'espère que ceci t'aidera.

    Bonne journée ...

  6. #6
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Citation Envoyé par ProgElecT Voir le message
    Salut

    Par principe, une entrée numérique externe ou utilisateur, je fais un Replace , par . puis seulement après je vérifie avec IsNumeric, car IsNumeric ne sera True que si un . est le séparateur décimale, quelque soit la source du pays.
    Mauvaise idée car certains pays utilisent cette notation : 12,345.67.

    et suivant ceci "IsNumeric ne sera True que si un . est le séparateur décimale, quelque soit la source du pays." Mon test me donne valeur numérique OK si le champ contient 15,6 true !! ( et non 15.6)
    Comme l'a dit @Phil Rob, un CSV doit respecter un format précis.
    Et puisque tu as choisi la virgule comme séparateur, alors tes valeur numérique doivent imposer le point.

    Ensuite, tout est question de culture.
    Ceci devrait fonctionner pour un point. Convert.ToDecimal(value, NumberFormatInfo.InvariantInfo).
    Ceci devrait fonctionner pour une virgule. Convert.ToDecimal(value, CultureInfo.CreateSpecificCulture("fr-FR")).
    Mais il faut choisir l'un des deux et s'y tenir.

    Edit :
    CSV est un format assez libre mais cette liberté à l'inconvénient que son format est difficilement interprétable car il dépend du programme qui l'a généré.
    Certain utilise un point-virgule comme séparateur de valeurs, d'autre une virgule, j'ai déjà vu des pipes.
    Certain encadre tout par des guillemet double, d'autres non.
    Certain utilise le point comme séparateurs décimal, d'autres la virgule (JAMAIS les deux).
    Bref, c'est tout et n'importe quoi.

    Je te suggère fortement si cela est possible d'utiliser JSON comme format.
    C'est normé, alors pas de surprises ou de questions à se poser.

  7. #7
    Membre du Club
    Homme Profil pro
    Tooling - Testing
    Inscrit en
    Décembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Tooling - Testing

    Informations forums :
    Inscription : Décembre 2008
    Messages : 141
    Points : 65
    Points
    65
    Par défaut
    Réponse ou remarque partielle avant de réfléchir plus à fond à ta réponse. Merci popo.

    "Et puisque tu as choisi la virgule comme séparateur, alors tes valeur numérique doivent imposer le point."

    Dans un fichier CSV, rien n'empêche ces données tout en respectant le protocole
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     "ABCD","12,56","12345,67","XYZ"

  8. #8
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Oui PeD012, ta remarque est fondée pour TON système où les données sont enregistrées entre guillemets (je suppse que c'est un csv généré par xls). Ce dispositif impose d'enlever les guillemets mors de la lecture.
    Mais "à la base", en csv, les données sont seulement séparées par la virgule ce qui complique les mélanges de types que tu proposes.
    Ma solution de ce matin devrait te dépanner ...
    ...

  9. #9
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Chez moi, Excel utilise le point virgule pour séparer les valeur, aucun guillemet et le point comme séparateur décimal.
    Code CSV : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    No dossier;Forme;Raison sociale;Prénom;CP;Ville;N° SIREN;Code NAF;Etat du risque client;Capital libéré
    000000;EURL;CABINET;;69279;LYON CEDEX 09;;;;0
    08972;SAS;PREFORMED LINE PRODUCTS;;78200;BUCHELAY;795279512;2599B;;5000
    85174;;GROUPE SAB CONSO;;42670;BELMONT DE LA LOIRE;;;;12,5
    FRODON;;FRODON SAQUET;;69000;LYON;;;V;0
    LPH003;;LPH003;;;;;;;0
    SEC001;;Second Cabinet;;;;;;;0
    SVB300;;EN COURS DE CREATION;;;;;;;0


    Citation Envoyé par PeD012 Voir le message
    Réponse ou remarque partielle avant de réfléchir plus à fond à ta réponse. Merci popo.

    "Et puisque tu as choisi la virgule comme séparateur, alors tes valeur numérique doivent imposer le point."

    Dans un fichier CSV, rien n'empêche ces données tout en respectant le protocole
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     "ABCD","12,56","12345,67","XYZ"
    Rien ne l'empêche mais comme l'a très justement mentionné @Phil Rob, ça t'oblige à prendre en compte ces guillemets.
    Alors que dans un système comme celui que j'ai mis plus haut (celui généré par Excel), tu n'as rien besoin de transformer.
    Tu auras encore moins de problème avec du JSON qui est normé et où tu ne peux pas te permettre ce genre de fioritures.
    Le plus important dans ma remarque était de choisir entre le point et la virgule dans une souci de cohérence et surtout pour éviter d'avoir à mettre des rustines infames dans le code qui va le lire.

  10. #10
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 420
    Points : 2 179
    Points
    2 179
    Par défaut
    Bonjour,
    Contrairement à ce qu'il nous vient à l'esprit en matière de CSV le séparateur de champs n'est pas le point virgule [;] mai la virgule [,] et le séparateur décimal et le point [.] Et pas la virgule [,]. C'est Excel qui en utilisant les paramètres régionaux gère le [;] et la [,]

    L'outil qui a formaté le CSV ne devrait avoir que partiellement ces informations il à donc encadré par des doubles guillemets ["] les chêne de caractère ce qui explique qu'il n'y ait pas de de numérique

    "ABCD","12,56","12345,67","XYZ" Vu que la virgule ne constitue pas un séparateur décimal !
    Normalement ton CSV devrait ressembler à ça
    "ABCD",12.56,12345.67,"XYZ"

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/01/2022, 13h39
  2. Test sur les champs de formulaire avec jQuery
    Par imenfatma dans le forum jQuery
    Réponses: 2
    Dernier message: 12/03/2013, 16h10
  3. Vérifier qu'un champs est un numérique
    Par olivier94 dans le forum Langage
    Réponses: 2
    Dernier message: 18/02/2007, 21h21
  4. remplir un champ numérique avec 0
    Par 18Marie dans le forum SQL
    Réponses: 4
    Dernier message: 16/02/2007, 11h46
  5. UPDATE d'une table avec test d'un champ d'une autre table
    Par delphim dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/05/2004, 12h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo