Double in Char Umwandeln
-
Wie wandel ich ein Zahl vom Typ double (Unbekannte Nachkommestellen) in einen Zeichenkettes des Types char um ?
Dabei soll die Zeichenkette die mimale aber nötige Länge haben um die Zahl komplett darzustellen. So soll 123.567999 zu "123.56799" werden und nicht zu "123.57" oder "123.567999000". Solche Ergebniss bekomme ich aber mit sprintf.
Ich hab es noch wie folgt probiert:
void toString(const char *str, double d) { stringstream str2; str2 << d; string als_string = str2.str(); str = als_string.c_str(); }
Doch dies liefert komische Zeichen, aber keine Zahl.
-
Warum willst du den string wieder in einen C-String umwandeln? Verwende besser durchgehend std::string. Wenn du dabei bleiben willst, musst du strcpy statt Zuweisung verwenden oder einen Zeiger auf einen Zeiger verwenden und den Speicher dynamisch allokieren (string.c_str() liefert soweit ich weiß ein temporäres Objekt zurück). Du willst ja schließlich den Zeiger selbst verändern, also die Addresse auf die er zeigt. Klar?
-
Nein, könnte du das vielleicht als Code hinschreiben ?
-
dein als_string string existiert nur in der toString funktion. sobald die verlassen wird, gibts den nicht mehr und der str* zeigt auf was ungültiges. abgesehen davon müsstest du ne referenz oder nen pointer auf nen pointer übergeben und nicht nen const pointer
-
Ich hatte einen const Pointer übergeben, weil c_str() dies verlangt hat.
Könnte mir irgnedjmd. vielleicht hinschreiben wie man das Problem elegant löst ?
-
Eigentlich hast Du's doch schon fast gehabt:
pressure schrieb:
...
string toString(double d) { ostringstream str2; // o... reicht str2 << d; return str2.str(); }
...
... wobei sich da schon die Frage stellt, ob diese Funktion sinnvoll ist oder Du nicht besser gleich mit dem ostringstream arbeitest....
Diese Funktion lohnt sich, wenn Du an vielen Stellen genau DAS hier brauchst.
Wenn Du dagegen viel mit strings arbeitest und die konkatenierst, durchsuchst, .... kannst Du besser mit stringstream arbeiten.Gruß,
Simon2.
-
Danke, ich brauch nur genau diese Funktion an ein paar mehr Stellen !
EDIT:
Aber jetzt habe ich doch nur einen String und keinen Datentyp Char...
Ich benötige aber den Datentyp Char.
-
string toString(const char *str, double d) { ostringstream str2; // o... reicht str2 << d; return str2.str(); }
bist du sicher?
void to_string(std::string& str, const double d) { std::ostringstream ss; ss << d; str = ss.str(); }
... zumindest laut Funktionskopf
-
is zwar nicht c++
aber trotzdem möglich.
sprintf(str, "%.5f", d);
-
sothis_ schrieb:
is zwar nicht c++
aber trotzdem möglich.
sprintf(str, "%.5f", d);
Damit habe ich es schon probiert, aber wenn meine double zum Beispiel "1.5672345" ist dann wird "1.56723" angezeigt und das ist eben nicht was ich will.
-
hmm .5 gibt die Nachkommastellen an...
-
pressure schrieb:
sothis_ schrieb:
is zwar nicht c++
aber trotzdem möglich.
sprintf(str, "%.5f", d);
Damit habe ich es schon probiert, aber wenn meine double zum Beispiel "1.5672345" ist dann wird "1.56723" angezeigt und das ist eben nicht was ich will.
http://www.gnu.org/software/libc/manual/html_node/Rounding-Functions.html#Rounding-Functions hilft vielleicht :). wenn nicht, dann habe ich dein Problem nicht verstanden, denke ich
-
(D)Evil schrieb:
...bist du sicher? ;)... zumindest laut Funktionskopf
Japp, ich habe die Schnittstelle semantisch verändert ... das war aber kein Zufall, sondern halte ich für besser.
Aber stimmt natürlich: Deine Variante ist dichter am Original (und damit an ihren Schwächen
).
Gruß,
Simon2.
-
pressure schrieb:
sothis_ schrieb:
is zwar nicht c++
aber trotzdem möglich.
sprintf(str, "%.5f", d);
Damit habe ich es schon probiert, aber wenn meine double zum Beispiel "1.5672345" ist dann wird "1.56723" angezeigt und das ist eben nicht was ich will.
... aber genau da liegt auch ein Problem bei dieser Herangehensweise: Du weißt nicht im Vorhinein, wie lang Dein String werden wird !
Deswegen kannst Du nur von einer "wird schon nicht länger werden" Hypothese ausgehen, die Dich jederzeit in den Allerwertesten beißen kann: Entweder allozierst Du permanent viel zu viel Speicher ... oder es ist einfach wirklich mal zu kurz und dann bekommst Du undefiniertes Verhalten.
Hier hat sothis_ diese Hypothese ein wenig "stabilisiert", indem er sich sagt: "Mehr als 5 Nachkommastellen sind sowieso nicht relevant" (*).Ein wenig besser ist dann snprintf() (dem man dann mitgeben kann, wieviel Speicher man zur Verfügung gestellt hat), aber da musst Du Dir auch eine Strategie überlegen (und implementieren), was denn passieren soll, wenn der Platz nicht reicht.
All das nimmt Dir string(stream) ab.
Gruß,
Simon2.
P.S.: (*) Diese Annahme ist sowieso gar nicht so dumm, weil mit doubles sowieso nicht beliebig genau gerechnet werden kann. Wer wirklich bis in die 20. Nachkommastelle exakt arbeiten muss, sollte sich nicht auf doubls verlassen ....
-
Simon2 schrieb:
Hier hat sothis_ diese Hypothese ein wenig "stabilisiert", indem er sich sagt: "Mehr als 5 Nachkommastellen sind sowieso nicht relevant" (*).
P.S.: (*) Diese Annahme ist sowieso gar nicht so dumm, weil mit doubles sowieso nicht beliebig genau gerechnet werden kann. Wer wirklich bis in die 20. Nachkommastelle exakt arbeiten muss, sollte sich nicht auf doubls verlassen ....
hängt natürlich (wie immer) vom anwendungsfall ab. aber da ich davon ausgehe, dass nicht die formatierte zeichenkette zum weiterrechnen benutzt werden soll, habe ich einfach mal pauschal auf 5 stellen getippt
edit: code, der buffer overflows verhindert ist natürlich nachwievor notwendig, das ist korrekt
-
Um mein Problem zu präzisieren:
Der Benutzer kann in mehreren Eingabefeldern Gleitkommazahlen eingeben:
1x mit 3 Nackommastellen.
1x mit 12 Nachkommastellen.
6x mit 5 Nachkommastellen.Dies wird dann einglesen und zum Beispiel in einer Datei gespeichert.
Nun gibt es einen Funktion, dass man die Eingabe aus eine Datei auslesen kann und dann wiederum im betreffenden Feld angezeigt wird.Bis jetzt hab ich jeweils sprintf mit den maximalen Nachkommastellen verwendet. Doch wenn der Benutzer nicht alle Nachkommastellen verwendet und bei dem Feld mit 3 Nachkommastellen nur eine Ganzzahl eingibt, dann wird beim Laden aus der Datei immer z.B. 3.000 dahrgestellt (3 sollte angezeigt werden). Ich will jeweils wenn nicht benötigt keine nachgestellten Nullen oder einen Punkt.
-
Hmm nimm einfach stringstreams und setprecision ... damit solltest du zurechtkommen.
-
oder lies die benutzereingaben gleich als string bevor du sie in eine datei speicherst.
wandle sie erst in float oder double um, wenn du tatsächlich berechnungen damit durchführen willst (oder deren gültigkeit überprüfen willst).
-
Noch ne frage
string toString(double d) {...} //Kann man das so aufrufen? funktionMitChar(toString(8.459).c_str()); //oder muss man das so machen? string str=toString(8.459); funktionMitChar(str.c_str());
Wird der string da zufrüh zerstört, wenn man direkt bei der Funktion das c_str aufruft oder bleibt der return string so lang gültig?
-
nein, kannst du so machen.