197 votes

Comment convertir un double en chaîne de caractères en C++ ?

Je dois stocker un double sous forme de chaîne. Je sais que je peux utiliser printf si je voulais l'afficher, mais je veux juste la stocker dans une variable de type chaîne de caractères afin de pouvoir la stocker dans une carte plus tard (comme la variable valeur et non le clé ).

2 votes

Une question pour répondre à votre question : pourquoi stockez-vous la valeur double dans une chaîne de caractères pour la stocker dans une carte ? Allez-vous utiliser le double modifié en chaîne comme clé ? Si non, pourquoi ne pas laisser le double tel quel ?

1 votes

Point intéressant. L'utilisation d'un double comme clé de mappe peut cependant être périlleuse, car les comparaisons exactes sur des valeurs à virgule flottante le sont toujours. L'indexation sur une représentation de chaîne de caractères permet d'éviter ce problème.

0 votes

Non, le double va entrer comme valeur dans une map<string, string>. J'ai un tas de paramètres de configuration qui sont de types mixtes, et j'utilise la carte comme un endroit pratique pour les stocker tous.

222voto

Adam Rosenfield Points 176408
// The C way:
char buffer[32];
snprintf(buffer, sizeof(buffer), "%g", myDoubleVar);

// The C++03 way:
std::ostringstream 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<std::string>(myDoubleVar);

15 votes

Upvoted pour la façon C++ 11. Je suis nouveau dans le C++, et je n'ai pas réalisé qu'il y avait un système de gestion de la qualité. to_string fonction. J'utilise Microsoft Visual C++ 2013.

196voto

Johannes Schaub - litb Points 256113

Le site boost (tm) manière :

std::string str = boost::lexical_cast<std::string>(dbl);

Le site C++ standard manière :

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

Nota : N'oubliez pas #include <sstream>

3 votes

Je pense que boost::lexical_cast est à peu près la méthode standard du C++, juste joliment emballée pour vous. BTW, litb, vous avez une petite coquille là-dedans -- "boost::lexical_cast".

2 votes

Boost::lexical_cast n'est pas seulement une simple enveloppe autour du code de stringstream. La plupart des routines de conversion sont implémentées en ligne. D'après les mesures de performance en bas de cette page ( boost.org/doc/libs/1_47_0/libs/conversion/lexical_cast.htm ), boost::lexical_cast est plus rapide que l'utilisation de stringstreams et, dans la plupart des cas, plus rapide que scanf/printf.

1 votes

@Ferr qui a dit que c'était un simple emballage ? Et merci d'avoir fourni le lien, j'ai en fait a fait je pense qu'il s'agissait plus ou moins d'une simple enveloppe :)

142voto

KennyTM Points 232647

Le site Standard C++11 (si vous ne vous souciez pas du format de sortie) :

#include <string>

auto str = std::to_string(42.5); 

to_string 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 les stod pour effectuer l'opération inverse.

Si vous voulez avoir un format de sortie différent de celui de l'UE, vous pouvez le faire. "%f" utilisez le snprintf ou ostringstream les méthodes illustrées dans d'autres réponses.

3 votes

Oh yeah baby. to_string et stod fonctionnent tous les deux dans Visual Studio 11.

0 votes

Oh mon bébé... to_string ne semble pas fonctionner dans VisualStudio 2010) : Cela, ou je ne sais pas ce que je fais (très possible).

1 votes

Existe-t-il un moyen de faire en sorte que cette fonction n'ajoute pas plus de décimales que nécessaire ? Lorsque je convertis le double 8.0 cela me donne la chaîne "8.000000" alors que "8" serait parfait.

24voto

Konrad Rudolph Points 231505

Si vous utilisez C++, évitez sprintf . Ce n'est pas C++ et cela pose plusieurs problèmes. Les Stringstreams sont la méthode de choix, de préférence encapsulés comme dans le module Boost.LexicalCast ce qui peut être fait assez facilement :

template <typename T>
std::string to_string(T const& value) {
    stringstream sstr;
    sstr << value;
    return sstr.str();
}

Utilisation :

string s = to_string(42.5);

11voto

coppro Points 10692

sprintf est acceptable, mais en C++, la meilleure façon, plus sûre et aussi légèrement plus lente, d'effectuer la conversion est d'utiliser la commande stringstream :

#include <sstream>
#include <string>

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

Vous pouvez également utiliser Boost.LexicalCast :

#include <boost/lexical_cast.hpp>
#include <string>

// In some function:
double d = 453.23;
std::string str = boost::lexical_cast<string>(d);

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

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