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


  • Mod

    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...


  • Mod

    Du kannst ja auch einfach ein eigenes to_string schreiben, welches dann intern über stringstreams funktioniert. Die haben volle Localeünterstütztung.


Anmelden zum Antworten