71 votes

Convertir un float en std::string en C++.

Je dispose d'une valeur flottante qui doit être placée dans un fichier std::string . Comment convertir un flottant en chaîne de caractères ?

float val = 2.5;
std::string my_val = val; // error here

4 votes

Pensez à lire l'article de Herb Sutter "The String Formatters of Manor Farm" ( gotw.ca/publications/mill19.htm ). Il fournit des exemples de cinq des manières les plus courantes de formater les choses et discute de leurs avantages et inconvénients.

138voto

dmckee Points 50318

À partir de C++11, la bibliothèque standard C++ fournit la fonction std::to_string(arg) avec différents types de support pour arg .

9 votes

Soyez conscient d'un éventuel comportement inattendu de std::to_string() lorsque vous travaillez avec des flottants. (Voir la sortie des exemples sur ce lien fr.cppreference.com/w/cpp/string/basic_string/to_string ).

0 votes

Cette réponse mérite d'être promue au rang de meilleure réponse parce que la plupart des environnements de construction ont déjà le support C++11.

60voto

Georg Fritzsche Points 59185

À moins que vous ne soyez préoccupé par les performances, utilisez flux de chaînes :

#include <sstream>
//..

std::ostringstream ss;
ss << myFloat;
std::string s(ss.str());

Si vous êtes d'accord avec Boost, lexical_cast<> est une alternative pratique :

std::string s = boost::lexical_cast<std::string>(myFloat);

Les alternatives efficaces sont par exemple FastFormat ou simplement les fonctions de style C.

0 votes

Ce sera une solution adéquate si l'on considère que ces fonctions seront appelées rarement (redimensionnement de la fenêtre), mais existe-t-il une méthode plus efficace ?

1 votes

Et si vous n'êtes pas d'accord avec Boost, écrivez votre propre fonction de cast lexical ; cela ne représente qu'environ cinq lignes de code et constitue une fonction de bibliothèque des plus utiles (cf. gotw.ca/publications/mill19.htm pour l'implémentation de base).

6 votes

Pour la première méthode, n'oubliez pas #include <sstream> .

17voto

dcp Points 26928

Vous pouvez définir un modèle qui fonctionnera non seulement avec les doubles, mais aussi avec d'autres types.

template <typename T> string tostr(const T& t) { 
   ostringstream os; 
   os<<t; 
   return os.str(); 
} 

Ensuite, vous pouvez l'utiliser pour d'autres types.

double x = 14.4;
int y = 21;

string sx = tostr(x);
string sy = tostr(y);

5voto

mloskot Points 13971

1voto

David Gladfelter Points 2756

Si vous êtes inquiet au sujet des performances, consultez la page Boost::lexical_cast bibliothèque.

12 votes

Je pense que vous voulez dire "si vous êtes no préoccupés par les performances". boost::lexical_cast est à peu près la solution la plus lourde que vous puissiez choisir !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X