Spracheinstellung setlocale beeinflusst atof



  • Hallo zusammen,

    ich hab jetzt echt nicht gewusst in welches Forum ich posten soll, wenn ich falsch liege, dann bitte verschieben.

    Aber nun zu meinem Problem:

    Ich binde 3rd-Party Treiber in mein Programm ein (DLL), die warum auch immer ein setlocale durchführt.

    Nachdem ich einen Aufruf aus dieser DLL gemacht habe, funktioniert mein atof nicht mehr zuverlässig, weil Punkt zu Komma und Umgekehrt wird.

    Was kann ich tun, damit ich wieder zuverlässig atof verwenden kann? Ein Überschreiben mit einem erneutem setlocale nach entsprechendem DLL-Aufruf kann ich nicht tun, da ich dann nicht mehr weiß, ob der Treiber einwandfrei funktioniert.

    Kann ich die aktuell eingestellte Sprache herausfinden? Dann könnte ich zumindest die Konvertierungsroutinen "per Hand" machen vor jedem atof.

    Für Hilfe wäre ich extrem dankbar,
    Norman-Timo



  • a) Du könntest auf atof verzichten und stattedessen stringstreams für deine Zahlenkonvertierung verwenden (die können notfalls ihr eigenes Locale bekommen, das mit dem globalen C-Locale nichts mehr zu tun hat).

    b) Ist mir nicht bekannt - außer du schreibst direkt bei der Einstellung mit, welches Locale gesetzt wurde.



  • Wenn du "setlocale(category, NULL)" aufrufst, erhälst du einen String zurück, der die entsprechende Sprache für diese Kategorie beschreibt (z.B. für LC_NUMERIC).

    Du könntest dir ja dann vor deinem atof-Aufruf die aktuelle Kategorie merken, dann neu setzen und anschließend wieder zurücksetzen.



  • norman_timo schrieb:

    Kann ich die aktuell eingestellte Sprache herausfinden? Dann könnte ich zumindest die Konvertierungsroutinen "per Hand" machen vor jedem atof.

    Sicher. Das geht mit setlocale - wie intuitiv 🙄

    const char* loc = setlocale(LC_ALL, 0);
    cout << "Current locale is: " << loc << endl;
    

    Du kannst dir auch die Werte einzelner Facetten geben lassen oder solche ersetzen. Für dich wäre LC_NUMERIC interessant.

    int main () {
    	// save name of current locale category
    	const char* oldNumLoc = setlocale(LC_NUMERIC, 0);	
    
    	// set a new locale category
    	setlocale(LC_NUMERIC, "German");
    
    	// use atof - uses new locale category
    	const char* ds = "2,12";
    	double d = atof(ds);
    	cout << d << endl;
    
    	// restore old locale category
    	setlocale(LC_NUMERIC, oldNumLoc);	
    }
    

    Sinnvoller ist aber sicher der von CStoll vorgeschlagene Weg.


Anmelden zum Antworten