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 :

Parse de double avec point décimal


Sujet :

C#

  1. #1
    Membre émérite
    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
    Points : 2 498
    Points
    2 498
    Par défaut Parse de double avec point décimal
    Bonjour

    Je n'ai pas encore bien compris comment traiter la conversion de double tenant compte que le séparateur décimal peut etre le POINT ou la VIRGULE

    Ce code ci sur ma machine fonctionne bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Double D=0.0f;
    String d="50,123546"
    bool ok=Double.TryParse(d,out D);
    Par contre si on me donne des doubles avec POINT, ca ne marche plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Double D=0.0f;
    String d="50.123546"
    bool ok=Double.TryParse(d,out D);
    Bien sur je pourrais faire un replace de '.' par ','

    Mais je sais qu'en jouant sur le cultureinfo et le NumberFormat je pourais faire une methode plus générale
    Malheureusement, je seche un peu avec la doc de MS.

    Merci a ceux qui ont la patience de m'aider sur ce sujet qui je pense a déja cassé la tete a d'autres !

  2. #2
    Expert éminent
    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 : 46
    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
    Points : 7 660
    Points
    7 660
    Par défaut
    Il faut jouer avec les cultures comme tu l'avais deviné.
    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
    string doubleValue = "45.98";
    CultureInfo culture;
    if (doubleValue.Contains("."))
    {
        // Utilisation de InvariantCulture si présence du . comme séparateur décimal. 
        culture = CultureInfo.InvariantCulture;
    }
    else
    {
        // Utilisation de CurrentCulture sinon (utilisation de , comme séparateur décimal).
        culture = CultureInfo.CurrentCulture;
    }
     
    // Conversion de la chaîne en double, en utilisant la culture correspondante.
    double result;
    bool ok = double.TryParse(doubleValue, NumberStyles.Number, culture, out result);
    Cette façon de faire fonctionne si la configuration du PC fait que le séparateur décimal est la virgule (CurrentCulture). InvariantCulture de son côté est associée à la langue anglaise, le séparateur décimal est donc le point.

    Après tu peux aussi jouer avec NumberFormatInfo comme tu l'avais indiqué.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    NumberFormatInfo n = new NumberFormatInfo();
    ni.NumberDecimalSeparator = ".";
    ...
    bool ok = double.TryParse(doubleValue, NumberStyles.Number, ni, out result);

  3. #3
    Membre émérite
    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
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci Stormimon

  4. #4
    Membre émérite
    Homme Profil pro
    Dev senior .Net, (ex-immigré français au Québec)
    Inscrit en
    Janvier 2006
    Messages
    727
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Dev senior .Net, (ex-immigré français au Québec)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 727
    Points : 2 385
    Points
    2 385
    Par défaut
    Citation Envoyé par StormimOn Voir le message
    Il faut jouer avec les cultures comme tu l'avais deviné.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CultureInfo culture;
    if (doubleValue.Contains("."))
    {
        // Utilisation de InvariantCulture si présence du . comme séparateur décimal. 
        culture = CultureInfo.InvariantCulture;
    Cela va planter en Belgique (au moins) (symbole de groupement : ".")

    Je n'arrive pas à trouver une solution simple,efficace, et propre (sans compter qu'en asp.net, je crains qu'il ne faille en plus gérer les cultures côté client et serveur...)

  5. #5
    Membre émérite
    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
    Points : 2 498
    Points
    2 498
    Par défaut
    Je reviens sur le sujet !

    Cela va planter en Belgique (au moins) (symbole de groupement : ".")


    Patatra effectivement

    Voila un client qui a un joli fichier

    Netto-D;PLZ
    219.090,31;1560
    309,99;1731
    60,35;1750
    257,62;1900
    Maintenant admettant que l'on detecte a coup de contains que le fichier contient un point ET une virgule, peux-on imaginer une maniere propre de convertir ?

    Pour le moment je fait betement ca et ca marche ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
          bool GoodVal = int.TryParse(Items[ImpDef.ColValue], out val);
          if (GoodVal == false)
          {
            double valD;
            GoodVal = double.TryParse(Items[ImpDef.ColValue], out valD);
            if (GoodVal)
            {
              val = (int)valD;
            }
          }

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    un truc simple en supposant que les deux seuls séparateurs possibles sont la virgule et le point :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    NumberFormatInfo nfi = NumberFormatInfo.CurrentInfo;
    string toto = "123.23";
    toto = toto.Replace(",", nfi.NumberDecimalSeparator).Replace(".", nfi.NumberDecimalSeparator);

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 173
    Points : 12 302
    Points
    12 302
    Par défaut
    219.090,31
    Celui-ci posera quelques problèmes avec cette méthode.

  8. #8
    Membre émérite
    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
    Points : 2 498
    Points
    2 498
    Par défaut
    je pense qu'il n'y a pas de methode idéale mais une serie d'approche heuristique possible

    1- Si les nombres sont tous constitué de deux separateurs diffferent, considerer le premier separateur rencoutré comme separateur de millier et le deuxième comme separateur décimal

    1.999.888,02
    1,999,888.02

    Dans les autres cas la connaissance humaine du contexte est nécessaire
    Car comme pour les dates tout est possible dans ce domaine !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] Réel double avec 0 décimales
    Par jeanphi45 dans le forum Access
    Réponses: 3
    Dernier message: 20/03/2012, 10h46
  2. Réponses: 8
    Dernier message: 11/08/2009, 18h31
  3. requte avec points de suspension
    Par Luther13 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 08/12/2005, 16h56
  4. particules animées avec point sprites ?
    Par ilimo dans le forum DirectX
    Réponses: 3
    Dernier message: 10/09/2004, 23h12
  5. Requete avec des décimales
    Par Sandrine75 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 27/06/2003, 10h18

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