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.


Anmelden zum Antworten