Ich muss ein Double als String speichern. Ich weiß, dass ich es verwenden kann, printf
wenn ich es anzeigen möchte, aber ich möchte es nur in einer Zeichenfolgenvariablen speichern, damit ich es später in einer Karte speichern kann (als Wert , nicht als Schlüssel ).
171
Antworten:
Der Boost (tm) Weg:
Der Standard C ++ Weg:
Hinweis : Vergessen Sie nicht
#include <sstream>
quelle
#include <sstream>
für den c ++ Weg :)#include <sstream>
, wird aus Gründen der Dokumentation die Fehlermeldung "Unvollständiger Typ ist nicht zulässig" angezeigt.quelle
operator <<
erstd::ostream&
eher a als a zurückgibtstringstream&
.to_string
Funktion gibt. Ich verwende Microsoft Visual C ++ 2013.Der Standard C ++ 11 Weg (wenn Sie sich nicht für das Ausgabeformat interessieren):
to_string
ist eine neue Bibliotheksfunktion, die in N1803 (r0), N1982 (r1) und N2408 (r2) " Simple Numeric Access " eingeführt wurde. Es gibt auch diestod
Funktion, den Rückwärtsgang durchzuführen.Wenn Sie ein anderes Ausgabeformat als möchten
"%f"
, verwenden Sie die Methodensnprintf
oderostringstream
, wie in anderen Antworten dargestellt.quelle
8.0
, bekomme ich den String"8.000000"
, während"8"
das vollkommen in Ordnung wäre.1e-9
produziert0.000000
Wenn Sie C ++ verwenden, vermeiden Sie
sprintf
. Es ist un-C ++ y und hat mehrere Probleme. Stringstreams sind die Methode der Wahl, vorzugsweise wie in Boost.LexicalCast gekapselt , was ganz einfach möglich ist:Verwendung:
quelle
Sie können std :: to_string in C ++ 11 verwenden
quelle
std::to_string()
gaben einfach 0,000000 zurück und nicht in wissenschaftlicher Form.sprintf
ist in Ordnung, aber in C ++ ist die bessere, sicherere und auch etwas langsamere Art der Konvertierungstringstream
:Sie können auch Boost.LexicalCast verwenden :
In beiden Fällen
str
sollte"453.23"
danach sein. LexicalCast bietet einige Vorteile, da es sicherstellt, dass die Transformation abgeschlossen ist. Es verwendetstringstream
s intern.quelle
Ich würde mir die C ++ String Toolkit Libary ansehen . Habe gerade eine ähnliche Antwort an anderer Stelle gepostet. Ich habe es sehr schnell und zuverlässig gefunden.
quelle
Herb Sutter hat einen ausgezeichneten Artikel über die Formatierung von Strings . Ich empfehle es zu lesen. Ich habe es schon einmal auf SO verlinkt .
quelle
Das Problem mit lexical_cast ist die Unfähigkeit, die Genauigkeit zu definieren. Wenn Sie ein Double in eine Zeichenfolge konvertieren, möchten Sie dies normalerweise ausdrucken. Wenn die Genauigkeit zu hoch oder zu gering ist, wirkt sich dies auf Ihre Ausgabe aus.
quelle
Sie können auch stringstream verwenden .
quelle
Heh, ich habe das gerade geschrieben (ohne Bezug zu dieser Frage):
quelle
Vielleicht möchten Sie meinen vorherigen Beitrag auf SO lesen. (Makroversion mit einem temporären Ostringstream-Objekt.)
Für die Aufzeichnung: In meinem eigenen Code bevorzuge ich snprintf (). Mit einem char-Array auf dem lokalen Stapel ist es nicht so ineffizient. (Nun, vielleicht, wenn Sie die Arraygröße überschritten und eine Schleife durchgeführt haben, um dies zweimal zu tun ...)
(Ich habe es auch über vsnprintf () verpackt. Aber das kostet mich eine Typprüfung. Yelp, wenn Sie den Code wollen ...)
quelle
Schauen Sie sich an
sprintf()
und Familie.quelle
Normalerweise müssen Sie für diese Operationen die Funktionen ecvt, fcvt oder gcvt verwenden:
Als eine Funktion:
quelle
Sie könnten einen kompakteren Stil ausprobieren:
quelle
Verwenden Sie
to_string()
.Beispiel:
Führen Sie es selbst aus: http://ideone.com/7ejfaU
Diese sind ebenfalls verfügbar:
quelle
Mit dieser Funktion können Sie alles in alles konvertieren:
Verwendung :
quelle