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

SL & STL C++ Discussion :

convertir std::string en float


Sujet :

SL & STL C++

  1. #1
    Membre confirm�
    Inscrit en
    Juin 2005
    Messages
    89
    D�tails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 89
    Par d�faut convertir std::string en float
    Bonjour, j'ai une fonction qui retroune une chaine apr�s avoir lu dans un fichier XML. En fonctions des cas, cette chaine peut �tre utilis�e telle quelle ou parfois, elle doit etre utiliser en tant que float.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    std::string str = "1,5";
    float f = str;
    il apparait donc le code d'erreur impossible de convertir une chaine en float, avez vous une solution??
    merci

  2. #2
    Expert confirm�
    Avatar de Swo�g
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    D�tails du profil
    Informations personnelles :
    �ge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par d�faut
    tu devrais jetter un coup d'oeil dans la : Comment convertir une string en un objet de n'importe quel type ?
    R�dacteur "�clectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les R�gles du Forum - Mon Site Web sur DVP.com (D�veloppement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne r�pondrai � aucune question technique via MP, MSN ou Skype : les Forums sont l� pour �a !!! Merci de me demander avant de m'ajouter � vos contacts sinon je bloque !
    pensez � la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  3. #3
    Invit�
    Invit�(e)
    Par d�faut
    Citation Envoy� par radicalrider
    Bonjour, j'ai une fonction qui retroune une chaine apr�s avoir lu dans un fichier XML. En fonctions des cas, cette chaine peut �tre utilis�e telle quelle ou parfois, elle doit etre utiliser en tant que float.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    std::string str = "1,5";
    float f = str;
    il apparait donc le code d'erreur impossible de convertir une chaine en float, avez vous une solution??
    merci

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    float f=atof(str.c_str());
    non?

  4. #4
    Expert confirm�
    Avatar de Swo�g
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    D�tails du profil
    Informations personnelles :
    �ge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par d�faut
    Citation Envoy� par Luc Raymond
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    float f=atof(str.c_str());
    non?
    �a c'est du C... de plus, sauf erreur de ma part, atof est obsol�te, non ?
    R�dacteur "�clectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les R�gles du Forum - Mon Site Web sur DVP.com (D�veloppement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne r�pondrai � aucune question technique via MP, MSN ou Skype : les Forums sont l� pour �a !!! Merci de me demander avant de m'ajouter � vos contacts sinon je bloque !
    pensez � la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  5. #5
    Invit�
    Invit�(e)
    Par d�faut
    Citation Envoy� par Swo�g
    �a c'est du C... de plus, sauf erreur de ma part, atof est obsol�te, non ?
    cela reviendrait au m�me de dire que le language C est obsolete! ATOF est encore valide dans le standard ansi-c.

    On peut arriver � l'�quivalent avec un proc�d� iostream, mais il n'y pas d'obligation de l'utiliser. Je n'offrais qu'une alternative simple.

    J'utilise souvent le printf au lieu du cout, je ne m�rite pas le coup de fouet pour autant!

  6. #6
    Expert confirm�
    Avatar de Swo�g
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    D�tails du profil
    Informations personnelles :
    �ge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par d�faut
    ce que je voulais dire, c'est qu'il me semblait que m�me en C les fonction *toa ou ato* �taient pass�es obsol�tes et que d'autres fonctions les rempla�aient...

    de plus, si tu fait du C++, alors si tu m�rites les coups de fouet
    C++ et C sont des langages diff�rents, avec des optiques diff�rentes...

    Si des librairies existent en C++ alors utiliser leur version C est un non-sens, et surtout quand on parle de la SL... rien n'est pire qu'un code o� se m�le C et C++ �a aide pas � la lecture, et �a rel�ve du non suivi total des r�gles de coding...
    R�dacteur "�clectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les R�gles du Forum - Mon Site Web sur DVP.com (D�veloppement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne r�pondrai � aucune question technique via MP, MSN ou Skype : les Forums sont l� pour �a !!! Merci de me demander avant de m'ajouter � vos contacts sinon je bloque !
    pensez � la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  7. #7
    Membre confirm�
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    38
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 38
    Par d�faut Boost
    Une solution �l�gante mais pas forc�ment facile est d'utiliser la libraire Boost.LexicalCast (attention aux exceptions) :

    #include <boost/lexical_cast.hpp>
    #include <iostream>
    #include <string>
    int main(int argc, char* argv[])
    {

    std::string s="12.2";
    float f = boost::lexical_cast<float>(s);
    std::cout << "f = " << f << std::endl;
    }

  8. #8
    Membre �clair�
    Inscrit en
    Mai 2003
    Messages
    86
    D�tails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 86
    Par d�faut
    Bonjour,
    Pour info le boos::lexical_cast est juste 10 fois plus lent que le std::istringstream...

    Ca fait r�fl�chir...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    41
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 41
    Par d�faut
    Bah oui, tomtom a raison : Il suffit de de faire :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    std::istringstream instr(str);
    float f;
    instr >> f;

  10. #10
    Membre �prouv�
    Profil pro
    Inscrit en
    Ao�t 2003
    Messages
    159
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 159
    Par d�faut
    Citation Envoy� par Tournevyks
    Bah oui, tomtom a raison : Il suffit de de faire :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    std::istringstream instr(str);
    float f;
    instr >> f;
    Ce code est problematique pour "12,5" au lieu de "12.5"

  11. #11
    Membre �clair�
    Inscrit en
    Mai 2003
    Messages
    86
    D�tails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 86
    Par d�faut
    Citation Envoy� par Luther13
    Ce code est problematique pour "12,5" au lieu de "12.5"
    Je pense que �a d�pend des configurations du systeme non ?

  12. #12
    Membre �prouv�
    Profil pro
    Inscrit en
    Ao�t 2003
    Messages
    159
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 159
    Par d�faut
    Je dirais plut�t des param�tres linguistiques.
    Et �a, je maitrise pas.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    41
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 41
    Par d�faut
    Citation Envoy� par Luther13
    Ce code est problematique pour "12,5" au lieu de "12.5"
    Les objets istringstream servent justement � pouvoir traiter une cha�ne facilement. On pourrait par exemple tester si le caract�re qu'on a lu est une virgule, et dans ce cas, le remplacer par un point.

  14. #14
    Invit�
    Invit�(e)
    Par d�faut
    Citation Envoy� par Swo�g
    ce que je voulais dire, c'est qu'il me semblait que m�me en C les fonction *toa ou ato* �taient pass�es obsol�tes et que d'autres fonctions les rempla�aient...

    de plus, si tu fait du C++, alors si tu m�rites les coups de fouet
    C++ et C sont des langages diff�rents, avec des optiques diff�rentes...

    Si des librairies existent en C++ alors utiliser leur version C est un non-sens, et surtout quand on parle de la SL... rien n'est pire qu'un code o� se m�le C et C++ �a aide pas � la lecture, et �a rel�ve du non suivi total des r�gles de coding...
    citation ->

    The C++ standard library incorporates the C standard library with some small modifications to make it work better with the C++ language. Another large part of the C++ library is based on the Standard Template Library (STL).
    le standard C++ est consitu� DE LA LIBRARIE C + la STL + iostream.
    j'avoue qu'il y a plusieur solution au probl�me identifi�, mais ma r�ponse fait quand m�me partie du standard.


  15. #15
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    D�cembre 2003
    Messages
    3 549
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 3 549
    Par d�faut
    Pour info le boos::lexical_cast est juste 10 fois plus lent que le std::istringstream...

    Ca fait r�fl�chir...
    C'est faux.
    C'est juste l�g�rement plus lent parce que y'a un appel de fonction et une vraie gestion d'erreur.

    �a peut m�me �tre plus rapide parce que �a peut �tre sp�cialis� en fonction des types.

  16. #16
    Membre confirm�
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    38
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 38
    Par d�faut
    Citation Envoy� par tomtom7
    Bonjour,
    Pour info le boos::lexical_cast est juste 10 fois plus lent que le std::istringstream...

    Ca fait r�fl�chir...
    Certainement que lexical_cast est plus 'lent', moins rapide, mais c'est tr�s subjectif et d�pend du contexte d'utilisation, fr�quence...

    Pour ceux qui lisent l'anglais une lecture de ceci s'impose : http://www.gotw.ca/publications/mill19.htm
    Et aussi de ce livre "Beyond the C++ Standard Library, An introduction to Boost" pages 73-78

  17. #17
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    * *toa n'a jamais fait parti du standard C

    * Il me semble aussi avoir lu que ato* �taient d�conseill�s en C aujourd'hui et qu'il fallait leur pr�f�rer une autre forme -- ce que r�sume tr�s bien "d�pr�ci�". Probablement pour r�gler les probl�mes de r�entrance et que les ato* renvoient 0 quand la convertion n'a pas �t� possible (ce qui est top utile !!)

    * Pour ceux qui s'inqui�tent des perf, j'ai deux liens : d'abord la s�rie d'articles de Mathew Wilson parus dans le forum expert du feu CUJ (dispos aujourd'hui sur le DDJ, normalement). Et un truc que j'ai crois� il y a peu sur le site de Maciej Sobczak : http://www.msobczak.com/prog/fastreams/
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  18. #18
    Membre �clair�
    Inscrit en
    Mai 2003
    Messages
    86
    D�tails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 86
    Par d�faut
    Citation Envoy� par loufoque
    C'est faux.
    C'est juste l�g�rement plus lent parce que y'a un appel de fonction et une vraie gestion d'erreur.

    �a peut m�me �tre plus rapide parce que �a peut �tre sp�cialis� en fonction des types.
    Comment tu fais le test alors ?

    Moi j'ai fait :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    double d;
     
    for(int i:0; i<1000;i++)
    {
    d = boost::lexical_cast<double>("10.2");
    }
     
    std::istringstream iss;
    for(int i:0; i<1000;i++)
    {
    iss.str("10.2");
    iss >> d;
    }
    J'ai chronom�tr� chaque boucle et de m�moire c'�tait 0.02 seconde pour la 1ere et 0.002 seconde pour la 2eme.

    Je suis ouvert � tout : comment fallait-il faire ?

  19. #19
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 39
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par d�faut
    Et en inversant les boucles?

  20. #20
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    D�cembre 2003
    Messages
    3 549
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 3 549
    Par d�faut
    Je suis ouvert � tout : comment fallait-il faire ?
    boost::lexical_cast cr�� et d�truit un stream � chaque it�ration, d'o� la diff�rence.

+ R�pondre � la discussion
Cette discussion est r�solue.
Page 1 sur 2 12 Derni�reDerni�re

Discussions similaires

  1. [C#] Comment convertir une String en float ?
    Par DestinyWar45 dans le forum C#
    R�ponses: 7
    Dernier message: 08/10/2010, 04h19
  2. [C#] Convertir un string en float
    Par todier dans le forum C#
    R�ponses: 3
    Dernier message: 14/05/2007, 18h13
  3. convertir un string en float avec un format
    Par kisscool62 dans le forum C++/CLI
    R�ponses: 2
    Dernier message: 04/12/2006, 14h13
  4. convertir un string en float
    Par jayjay.f dans le forum AWT/Swing
    R�ponses: 9
    Dernier message: 17/11/2006, 18h24
  5. Convertir un String en Float
    Par alex75 dans le forum Langage
    R�ponses: 3
    Dernier message: 15/06/2006, 19h58

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