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

C# Discussion :

Truc pour parser un double avec point ou virgule


Sujet :

C#

  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Truc pour parser un double avec point ou virgule
    Bonjour

    Je me bat avec le parsage de double et j'avoue ne pas etre expert en la matiere de CultureInfo, NumberStyles et autre décors

    J'ai un string representant un double mais pouvant utiliser indifférement le point ou la virgule comme séparateur

    Pour le moment je n'ai rien trouvé de mieux qu'une machination du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     if (Items[ImpDef.coo.X].Contains("."))
     {
        ok = double.TryParse(Items[ImpDef.coo.X], NumberStyles.Number, CultureInfo.InvariantCulture, out X);
      }
      else
      {
        ok = double.TryParse(Items[ImpDef.coo.X], out X);
      }
    Qulqu'un a mieux a proposer ?
    Merci de votre assistance !

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    L'entrée peut-être au format US genre 1,245,250.52 ?

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    A priori non, mais je me demande si mon trucage ne s'en sortirait pas dans ce
    cas puisque je teste un point et non une virgule

    Maintenant si un malin donne
    1.000.000,25

    Je suis quand meme foutu !

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    Tu peux pas plutôt tester le format à la saisie ?

  5. #5
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Helas !

    Quand on traite des fichier on n'est pas toujour maitre de la saisie

  6. #6
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Et avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    double X;
    bool ok = true;
     
    if (!double.TryParse(Items[ImpDef.coo.X], NumberStyles.Number, CultureInfo.InvariantCulture, out X))
    {
        ok = double.TryParse(Items[ImpDef.coo.X], NumberStyles.Number, CultureInfo.CurrentCulture, out X)
    }

  7. #7
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Salut
    Moi j'ai eu le tour plusieurs fois quand je programmait un module d'import de données et comme j'en avais marre car personne me fournissait un fichier codé pareil, j'ai été un peu brutal avec un code de ce type :
    Code csharp : 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
     
    public void ConvertString2Double(string text, out double result)
    {
    	string separator = ",";
     
    	text = Regex.Replace(text, @"[\s]+", ""); // Supprime tous les espaces
     
    	Match m = Regex.Match(text, "(?<separator>)[^0-9]+[0-9]*$"); // Cherche la dernière suite de caractère non numérique de la chaine
    	if(m != null && m.Success)
    		separator = m.Groups["separator"].Value; // S'en sert comme séparateur
     
    	// Créer un formateur de nombre avec ce séparateur
    	NumberFormatInfo nfi = new NumberFormatInfo();
    	nfi.CurrencyDecimalSeparator = separator;
    	nfi.NumberDecimalSeparator = separator;
    	nfi.PercentDecimalSeparator = separator;
     
    	// Tente de convertir le nombre avec ce format
    	double.TryParse(Text, NumberStyles.Any, nfi, out result);
    }

    On peux améliorer l'expression rationnelle pour qu'elle tente de découvrir également le séparateur de groupe.
    Avec cette façon de faire ca gère également les écritures du style : 3€50 ou 12kg70. Ce n'est pas parfait et l'expression rationnelle peux être améliorée pas mal je pense.

  8. #8
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Bonjour

    - Pour Stormimonn : ta proposition ne marche pas (j'avais déja essayé car Aucun des deux TryParse ne rendend False dans ce cas) : Le double est juste mat converti

    - Pour ctxnop : ouais finalerment c'est la solution a mano qu'il faut employer

    C'est dommage mais les dates et les double c'est toujours heuristique

  9. #9
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Tu ne crois pas si bien dire. Ca me gave violent moi qu'on ne choisisse pas un standard international de stockage et qu'on s'y tienne. Il n'y à pas si longtemps j'ai du importé des données dans mon logiciel à partir d'un fichier texte que génère un logiciel concurrent quand on lui demande d'exporter ses données.
    J'ai galéré je ne sais combien de temps avant de m'apercevoir d'un truc abérant :
    Le fichier contenant des lignes dites "d'en-tête" et des lignes dites "sous-lignes".
    par exemple, la première ligne devait aller dans une table, les 3 suivantes dans une autre table ayant une relation avec la première. Jusque là, pas trop de problème. Sauf que, les lignes d'en-têtes avaient des dates formatées comme ceci : "24/02/2009", alors que les sous-lignes c'était : "20090224.." (date unix avec bourrage sur la droite par des points)
    Comme si un format de date c'était pas déjà assez chiant à gérer ...

Discussions similaires

  1. API Java pour parser un XML avec des balises avec nom de package
    Par rebelle49 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 11/08/2014, 13h22
  2. Parse de double avec point décimal
    Par olibara dans le forum C#
    Réponses: 7
    Dernier message: 28/11/2009, 08h59
  3. [JSTL] pattern pour parser un entier avec fmt:parseNumber
    Par javadool dans le forum Taglibs
    Réponses: 0
    Dernier message: 11/09/2009, 11h21
  4. duree pour parser un fichier avec un script awk
    Par kass28 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 26/03/2008, 16h35
  5. problème pour parser un fichier xml avec XML::Simple
    Par black_code dans le forum Modules
    Réponses: 3
    Dernier message: 30/01/2006, 19h32

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