std::to_string und std::locale
-
Hallo an alle,
ich wollte ein std::locale erstellen, wo der Dezimalpunkt ein ',' ist und der Tausenderseperator ein '.' ist. Mit folgendem Code funktioniert das auch soweit ganz gut:
#include<iostream> #include<locale> #include<string> using namespace std; struct de_numpunct: public numpunct<char> { char_type do_decimal_point() const noexcept override { return ','; } char_type do_thousands_sep() const noexcept override { return '.'; } string do_grouping() const override { return "\3"; } }; int main() { locale::global( locale{ {} , new de_numpunct } ); cout.imbue( {} ); cout << 1234.55 << endl << 5512315123 << endl; int i = 12345; cout << to_string( i ) << endl; cin.get(); return 0; }
Für die Streams (fstream, stringstream, usw.) klappt das wunderbar. Natürlich muss ich für cout und cin deren locale mittels imbue überschreiben (sind schließlich globale Objekte). Allerdings ignorieren die Funktionen std::to_string und (std::sto(i,ll,d...)) mein locale...
Wie kann ich also für diese Funktionen das locale überschreiben, sodass diese meine Vorgaben beachten?
Danke und MfG
shft
-
printf, to_string, stoi usw. benutzen die C-Locale (im Gegensatz zur C++-Locale). Die C-Locale wird zwar auch neu gesetzt, wenn du die globale C++-locale setzt, aber mit selbstdefinierten Locales funktioniert das normalerweise nicht, da die C-Locales das einfach nicht alles können. Probier mal, als Locale eine von deinem System vordefinierte Locale zu nehmen.
-
Danke für deine Antwort!
.< Ist insgesamt ziemlich ärgerlich, dann muss wohl std::locale::global( { "" } ); genügen...
-
Du kannst ja auch einfach ein eigenes to_string schreiben, welches dann intern über stringstreams funktioniert. Die haben volle Localeünterstütztung.