Problem mit wstring <-> double konvertierung
-
Moin! Ich hab mir diese Funktionen für meinen Interpreter geschrieben, aber sie
scheinen die falschen Werte zurückzugeben. Theoretisch könnte der Fehler auch
woanders liegen, das kann ich aber mit ziemlicher Sicherheit ausschließen. Wär
nett wenn ihr mal nach Fehlern gucken könntet:double ToDbl(wstring s) { if (s.size() == 0) return 0; char* buf = new char[s.size()]; wcstombs(buf, s.c_str(), s.size()); double d = atof(buf); delete [] buf; return d; } wstring ToWStr(double d) { char buf[80]; _snprintf(buf, 49, "%f", d); wchar_t wbuf[50]; mbstowcs(wbuf, buf, 50); wstring s(wbuf); s = s.substr(0, s.find_last_not_of(L'0') + 1); if (s[s.length() - 1] == L'.') s = s.substr(0, s.length() - 1); return s; }
-
Hallo
Da du eh schon mit std::wstring arbeitest, benutzt doch gleich std::wstringstream um die Konvertierung einfacher durchzuführen. Siehe auch die C++ FAQ, den Artikel "Einmal String und zurück".
bis bald
akari
-
Danke für die schnelle Antwort, den wstringstream und die FAQ guck ich mir mal an.
-
Juhu, es läuft, nochmal DAAANKE

Ist allerdings drei mal langsamer als die andere Methode. Aber hauptsache es läuft
erstmal
-
Hallo
Wenn dich der höhere Aufwand bei der C++ Variante wirklich im praktischen Betrieb stört, must du entweder
- optimieren : nicht wegen jeder einzelnen Konvertierung durch eine neue Funktion einen neuen wstringstream erstellen und wieder löschen, sondern mit einem wstringstream alle Werte auf einmal konvertieren
- doch die C-Variante benutzen, dann las dich ins Ansi-C Forum verschieben.bis bald
akari
-
Vonwegen Optimierung:
Bei der Umwandlung von Zahlen (auch doubles in "e+" Schreibweise) kann man sich u.U. zu Nutze machen dass nur Codepoints <= U+00F7 vorkommen werden -- und die lassen sich in die meisten Codepages 1:1 übernehmen -- ein Aufruf von wcstombs ist also nicht notwendig. Ich bin mir nichtmal sicher ob es überhaupt Codepages gibt bei denen sich die Zeichen die in einer Textrepresentation eines double vorkommen können nicht gleich wie in Unicode abgebildet werden.Weiters könnten die Funktionen wohl für die meisten Fälle einen kleinen Stack Buffer verwenden (vielleicht 100 Byte oder so), und nur für längere Strings dynamisch einen Buffer anfordern -- spart auch wieder Zeit.