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 :

Convert.ToDouble ne gère pas les points ?


Sujet :

C#

  1. #1
    Membre du Club Avatar de Electroniktor
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 150
    Points : 55
    Points
    55
    Par défaut Convert.ToDouble ne gère pas les points ?
    Bonjour tout le monde !

    Je débute en C# et je me trouve face à un problème bien ennuyeux : j'essaye de convertir en double un nombre décimal contenu dans une string avec la fonction Convert.ToDouble (), mais je me suis aperçu que cela marchait uniquement si la virgule du nombre était une vraie virgule et que cela plantait si c'était un point.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double a = Convert.ToDouble("1.5"); // plante
    double b = Convert.ToDouble("1,5"); // marche
    Or la majorité des nombres décimaux utilisent un point (si on fait double a = 5/2, a vaudra 2.5 et non 2,5 ...) donc je voudrais savoir si il existe une autre fonction qui convertis une string en double mais qui gère les points cette fois.

    Merci d'avance !

  2. #2
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    459
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 459
    Points : 553
    Points
    553
    Par défaut
    Tu as un problème de format : la chaîne est ici interprétée en fonction des paramètres régionaux définis.
    Utilise la surcharge avec un IFormatProvider et utilise NumberFormatInfo pour définir ton format.

  3. #3
    Membre du Club Avatar de Electroniktor
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 150
    Points : 55
    Points
    55
    Par défaut
    Salut, et merci de me répondre si vite !

    Mais je ne suis que débutant, et je ne comprend pas trop ce que tu veux me dire !

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 14
    Points : 13
    Points
    13
    Par défaut
    Ya le mode bourrin sinon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    string valeur = "1.5";
    double a = Convert.ToDouble(valeur.Replace(".",","));
    Au passage si ya des calculs precis a faire, le decimal est mieux.
    cf http://www.developpez.net/forums/sho...d.php?t=530049

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    459
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 459
    Points : 553
    Points
    553
    Par défaut
    Regarde l'aide sur NumberFormatInfo et surtout sur Convert.ToDouble, où tu trouveras un exemple précis avec NumberFormatInfo.

    Quant à "la méthode bourrin", je te la déconseille fortement : qu'adviendra-t-il quand ta culture locale changera ? Mieux vaut expliciter le format à utiliser, tu deviens alors portable...

  6. #6
    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
    La méthode bourrin on peut oublier effectivement ^^

    Si le séparateur décimal peut varier, passe par le NumberFormatInfo comme indiqué plus haut. Par contre le séparateur décimal est toujours le point, on peut aller au plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    using System.Globalization;
    ...
    double a = Convert.ToDouble("1.5", new CultureInfo("en-US"));
    // a vaut 1.5
    Le point étant le séparateur décimal en anglais, on indique d'utiliser cette culture pour la conversion.

    Attention à ne pas faire cette conversion avec une virgule comme séparateur décimal.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    using System.Globalization;
    ...
    double a = Convert.ToDouble("1,5", new CultureInfo("en-US"));
    // a vaut 15
    Tu n'auras pas d'erreur, mais le résultat ne sera pas celui attendu : 1,5 devient 15 car le séparateur des milliers, la virgule en anglais, est tout simplement supprimé.

  7. #7
    Membre du Club Avatar de Electroniktor
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 150
    Points : 55
    Points
    55
    Par défaut
    Merci beaucoup à vous tous, cela marche parfaitement maintenant !

    J'avais toujours pensé que le C++ était le meilleur langage de programmation mais depuis que j'apprend C#, je m'aperçois que je me suis lourdement planté !

    PS :
    Au passage si ya des calculs precis a faire, le decimal est mieux.
    cf http://www.developpez.net/forums/sho...d.php?t=530049
    Je code un calculateur d'expressions aritméthiques (styles : 2+2 ou 6*((2.6+0.7)/(5.8-3)) ). Il est donc préfèrable d'utiliser le type décimal ?

  8. #8
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 194
    Points
    5 194
    Par défaut
    salut

    Pour info, ya pas de meilleur langage qu'un autre...

    donc, C# n'est pas mieux que C++

    C'est juste qu'il est différent et que Microsoft a essayé de prendre le meilleur du C++ et du Java pour "pondre" le C#...

    Et il est vrai que le résultat est plutot sympa... Cela dit, après, il ne faut pas confondre le langage en lui même (qui est surtout sympa pour les delegate et les
    event).... et les librairies fournis (nombreuses sous Java qui font souvent dire au gens Java, c'est mieux que C#... alors que c'est juste différent)...

    Après, si on considère que le meilleur langage, c'est celui qui a le plus de librairie disponible pour limiter les développements à faire... C# n'est pas
    encore au niveau de Java... pour le moment

    The Monz, Toulouse

  9. #9
    Membre du Club Avatar de Electroniktor
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 150
    Points : 55
    Points
    55
    Par défaut
    Oui j'ai bien compris maintenant qu'il n'y a pas un meilleur langage qu'un autre car chaque langage est adapté pour uhe ou plusieurs tâches précises (pour faire un site web, PHP est mieux que C# et inversement pour créer un logiciel).

    Mais je pense que C# (et tous les langages .NET) a un bel avenir devant lui, ce qui n'est pas forcément le cas d'autres langages comme le C ou le C++ qui ont déjà fait leur temps. Comme disait mon grand-père, à chacun son époque !!!

  10. #10
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 14
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par BCmDev Voir le message
    Pas du tout ! Elle utilise implicitement la culture associée au thread courant, c'est d'ailleurs pour cela que je signalai le problème d'une culture locale changeante.
    Je comprend pas trop le probleme. On peux m'expliquer ?
    car si c'est bien en fr il y aura aucun caractere change puis c'est tout non ?

    Au passage, j'ai nomme cette methode bourrin car je me doutais bien que c'ete tres sale ^^

  11. #11
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Les fonctions de conversion depuis et vers les chaînes de caractères (respectivement Parse et ToString) s'appuient par défaut sur les locales de la machine pour interpréter les données.

    Sur une machine us :

    (4.5).ToString() renvoie "4.5"
    Convert.ToDouble("4.5") renvoie 4.5
    Convert.ToDouble("4,5") renvoie une exception

    Sur une machine fr :

    (4.5).ToString() renvoie "4,5"
    Convert.ToDouble("4.5") renvoie une exception
    Convert.ToDouble("4,5") renvoie 4.5

    C'est pour cela que les fonctions de conversion ont des surcharges qui prennent la culture en paramètre, pour savoir comment interpréter les données. Pour faire une appli qui résiste au changement de culture, ces surcharegs sont à préconiser.

  12. #12
    Expert éminent
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Points : 7 752
    Points
    7 752
    Par défaut
    Si les données proviennent de l'extérieur de l'application (fichiers), on peut utiliser InvariantCulture pour être sûr de pas avoir de problèmes.

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

Discussions similaires

  1. gettext ne gère pas les msgctxt
    Par bourriquet_42 dans le forum C
    Réponses: 2
    Dernier message: 17/07/2009, 16h22
  2. innerHTML qui ne gère pas les accents (à, é,è..)
    Par beegees dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 12/04/2009, 22h21
  3. Overflows numériques, pourquoi Java ne les gère pas ?
    Par Baptiste Wicht dans le forum Langage
    Réponses: 33
    Dernier message: 18/12/2007, 10h21
  4. [Module] netbeans et les dlls c'est pas au point
    Par eclesia dans le forum NetBeans
    Réponses: 3
    Dernier message: 04/03/2007, 19h20
  5. La fonction BuilCriteria n'accepte pas les points
    Par Tofalu dans le forum Access
    Réponses: 3
    Dernier message: 10/07/2006, 12h00

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