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 :

Ma conversion string en double tronque..


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut Ma conversion string en double tronque..
    Bonjour,

    je suis la procédure décrite dans la faq c++ et j'ai un soucis :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      istringstream   line;
      istringstream   iss;
      string            temp;
      double           value;
     
      //(...)
     
      std::getline( line, temp, tabul );
      iss.str( temp );
      // iss contient 6,4
      iss >> value;
      // value contient 6.0
    la partie décimale n'est pas gardée..

    J'ai essayé de remplacer le ',' par un '.' mais pas plus de succès.

    Qu'est ce qui cloche ?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2005
    Messages : 92
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    J'ai essayé de remplacer le ',' par un '.' mais pas plus de succès.
    Bizarre... c'est un problème de locale, pourtant, non?
    As-tu essayé avec un "." et en ajoutant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    iss.imbue(locale("C"));
    avant l'extraction de value?

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Le problème est tout simplement que... la notation des réels se fait à la manière anglaise

    Cela signifie que, lors de la convertion:
    • 6.04 représente une valeur réelle
    • 6,04 en représente deux

    La solution est donc, une fois que tu es sur que tu as affaire à un réel, de remplacer, tout simplement, la virgule par un point, du moins, si tu veux que la notation "francaise" soit prise en compte
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Citation Envoyé par koala01 Voir le message
    La solution est donc, une fois que tu es sur que tu as affaire à un réel, de remplacer, tout simplement, la virgule par un point
    Citation Envoyé par NiamorH
    J'ai essayé de remplacer le ',' par un '.' mais pas plus de succès.
    Je précise que je suis sous VC6.

    Mais je viens de tester sous visual 2005 et c'est effectivement la solution. J'ai peut être mal fait mon test, je retesterai demain.

    Citation Envoyé par Biozic
    iss.imbue(locale("C"));
    J'essaierai demain aussi. merci.

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Sie,
    Citation Envoyé par koala01 Voir le message
    ...
    La solution est donc, une fois que tu es sur que tu as affaire à un réel, de remplacer, tout simplement, la virgule par un point, du moins, si tu veux que la notation "francaise" soit prise en compte
    Ah bon, maintenant, en français on met un point comme séparateur des décimales.

    Comme je ne suis pas au courant, je suppose que ça vient de sortir ?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2005
    Messages : 92
    Par défaut
    Citation Envoyé par koala01 Voir le message
    La solution est donc, une fois que tu es sur que tu as affaire à un réel, de remplacer, tout simplement, la virgule par un point, du moins, si tu veux que la notation "francaise" soit prise en compte
    Si le flux d'entrée contient des réels formatés "à la française", on doit pouvoir, en choisissant convenablement la locale, se passer de faire un remplacement explicite. Exception (à confirmer): si il y a un séparateur de millier, comme un espace, l'extraction par >> risque de tomber à l'eau.

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Biozic Voir le message
    Si le flux d'entrée contient des réels formatés "à la française", on doit pouvoir, en choisissant convenablement la locale, se passer de faire un remplacement explicite. Exception (à confirmer): si il y a un séparateur de millier, comme un espace, l'extraction par >> risque de tomber à l'eau.
    Ce n'est pas impossible...

    Cependant, le mieux serait quand même, selon moi, de juste veiller à ce que les informations soient écrites de la manière dont on s'attend à ce qu'elles soient lues "nativement" par l'application, c'est à dire, sans espace entre les millilers, et avec un point comme indicateur de partie décimale...

    Il sera en effet bien plus simple, à mon sens, d'envisager d'adapter la valeur lue au cas où son affichage est nécessaire, de manière a permettre une compréhension "instinctive" de la valeur que de commencer à la maintenir dans un fichier sous cette forme non comprise par l'ordinateur et de devoir la convertir deux fois:
    • une fois pour que le pc la comprenne
    • une fois pour que l'utilisateur ne se méprenne pas sur la valeur qu'il lit à l'écran

    Maintenant, ce n'est jamais que mon avis perso... Mais je le partage
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Ceci marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    iss.imbue( std::locale( "French_france" ) );
    Je vais donc l'utiliser.

    Dans mon cas, il n'est pas possible de modifier la source du probleme en remplaçant les virgules par des points pour les valeurs du fichier lu car ce fichier m'est envoyé par un autre organisme et je dois le traiter tel quel.

    Je pourrais les remplacer avec de tenter l'opérateur >> ( je pense que j'ai mal fait mon premier test ) mais j'aime bien cette solution avec la locale.

    Merci à tous.

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/01/2009, 10h30
  2. Problème de conversion String en Double
    Par eighty_three dans le forum Langage
    Réponses: 7
    Dernier message: 19/06/2008, 09h41
  3. conversion string en double
    Par pouletator dans le forum Général Python
    Réponses: 4
    Dernier message: 24/10/2007, 10h35
  4. conversion string en double
    Par kakrocq dans le forum C++/CLI
    Réponses: 4
    Dernier message: 11/04/2007, 13h54
  5. conversion string en double
    Par zmatz dans le forum SL & STL
    Réponses: 2
    Dernier message: 14/10/2005, 22h46

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