Comment convertir un double en une chaîne en C ++?

J’ai besoin de stocker un double comme une chaîne. Je sais que je peux utiliser printf si je voulais l’afficher, mais je veux juste le stocker dans une variable de chaîne pour pouvoir la stocker plus tard dans une carte (comme valeur , pas la clé ).

La méthode boost ™ :

 std::ssortingng str = boost::lexical_cast(dbl); 

La méthode standard C ++ :

 std::ossortingngstream strs; strs << dbl; std::string str = strs.str(); 

Note : N'oubliez pas #include

 // The C way: char buffer[32]; snprintf(buffer, sizeof(buffer), "%g", myDoubleVar); // The C++03 way: std::ossortingngstream sstream; sstream << myDoubleVar; std::string varAsString = sstream.str(); // The C++11 way: std::string varAsString = std::to_string(myDoubleVar); // The boost way: std::string varAsString = boost::lexical_cast(myDoubleVar); 

La méthode standard C ++ 11 (si vous ne vous souciez pas du format de sortie):

 #include  auto str = std::to_ssortingng(42.5); 

to_ssortingng est une nouvelle fonction de bibliothèque introduite dans N1803 (r0), N1982 (r1) et N2408 (r2) ” Accès numérique simple “. Il y a aussi la fonction stod pour effectuer l’opération inverse.

Si vous souhaitez avoir un format de sortie différent de "%f" , utilisez les méthodes snprintf ou ossortingngstream comme illustré dans d’autres réponses.

Si vous utilisez C ++, évitez sprintf . C’est un-C ++ y et a plusieurs problèmes. Les chaînes de caractères constituent la méthode de choix, de préférence encapsulée comme dans Boost.LexicalCast, ce qui peut être fait assez facilement:

 template  std::ssortingng to_ssortingng(T const& value) { ssortingngstream sstr; sstr << value; return sstr.str(); } 

Usage:

 ssortingng s = to_ssortingng(42.5); 

Vous pouvez utiliser std :: to_ssortingng en C ++ 11

 double d = 3.0; std::ssortingng str = std::to_ssortingng(d); 

sprintf est correct, mais en C ++, la méthode de conversion est meilleure, plus sûre et aussi légèrement plus lente:

 #include  #include  // In some function: double d = 453.23; std::ossortingngstream os; os << d; std::string str = os.str(); 

Vous pouvez également utiliser Boost.LexicalCast :

 #include  #include  // In some function: double d = 453.23; std::ssortingng str = boost::lexical_cast(d); 

Dans les deux cas, str devrait être "453.23" après. LexicalCast présente certains avantages en ce sens qu'il garantit que la transformation est complète. Il utilise des ssortingngstream interne.

Je regarderais le Libary Toolkit de C ++ Ssortingng . Je viens juste de poster une réponse similaire ailleurs. Je l’ai trouvé très rapide et fiable.

 #include  double pi = M_PI; std::ssortingng pi_as_ssortingng = strtk::type_to_ssortingng( pi ); 

Herb Sutter a un excellent article sur le formatage des cordes . Je recommande de le lire. Je l’ai déjà associé sur SO.

Le problème avec lexical_cast est l’incapacité à définir la précision. Normalement, si vous convertissez un double en chaîne, c’est que vous voulez l’imprimer. Si la précision est trop ou trop petite, cela affecterait votre sortie.

Vous pouvez également utiliser ssortingngstream .

Heh, je viens d’écrire ceci (sans rapport avec cette question):

 ssortingng temp = ""; ssortingngstream outStream; double ratio = (currentImage->width*1.0f)/currentImage->height; outStream << " R: " << ratio; temp = outStream.str(); /* rest of the code */ 

Vous voudrez peut-être lire mon post précédent sur SO. (Version Macro avec un object ossortingngstream temporaire.)

Pour l’enregistrement: Dans mon propre code, je privilégie snprintf (). Avec un tableau de caractères sur la stack locale, ce n’est pas si inefficace. (Eh bien, peut-être que si vous avez dépassé la taille du tableau et fait une boucle pour le faire deux fois …)

(Je l’ai également emballé via vsnprintf (). Mais cela me coûte un peu de vérification de type. Yelp si vous voulez le code …)

Normalement pour cette opération, vous devez utiliser les fonctions ecvt, fcvt ou gcvt:

 /* gcvt example */ #include  #include  main () { char buffer [20]; gcvt (1365.249,6,buffer); puts (buffer); gcvt (1365.249,3,buffer); puts (buffer); return 0; } Output: 1365.25 1.37e+003 

En tant que fonction:

 void double_to_char(double f,char * buffer){ gcvt(f,10,buffer); } 

Jetez un coup d’oeil à sprintf() et à votre famille.

Vous pourriez essayer un style plus compact:

 std::ssortingng number_in_ssortingng; double number_in_double; std::ossortingngstream output; number_in_ssortingng = (dynamic_cast< std::ostringstream*>(&(output << number_in_double << std::endl)))->str(); 

Utilisez to_ssortingng() .
Exemple :

 #include  #include  using namespace std; int main () { ssortingng pi = "pi is " + to_ssortingng(3.1415926); cout<< "pi = "<< pi << endl; return 0; } 

lancez-le vous-même: http://ideone.com/7ejfaU
Ceux-ci sont également disponibles:

 ssortingng to_ssortingng (int val); ssortingng to_ssortingng (long val); ssortingng to_ssortingng (long long val); ssortingng to_ssortingng (unsigned val); ssortingng to_ssortingng (unsigned long val); ssortingng to_ssortingng (unsigned long long val); ssortingng to_ssortingng (float val); ssortingng to_ssortingng (double val); ssortingng to_ssortingng (long double val); 

Vous pouvez convertir n’importe quelle chose en utilisant cette fonction:

 template T to(U a) { std::ssortingngstream ss; T ret; ss << a; ss >> ret; return ret; }; 

utilisation:

 std::ssortingng str = to(2.5); double d = to("2.5");