Bei Gleitkommazahlen , statt . verwenden
-
Wenn ich dir sage, dass du den Stream entweder mit einer passenden locale imbuen musst oder mit einer selbstgestrickten locale mit einer passenden Ableitung der numpunct-Facette, reicht dir das dann als Anleitung?
Alternativ würde ich empfehlen, entweder deine User zu ihrem Glück zu zwingen (so würde ich es machen) oder diese Anpassungen auf einer höheren Programmebene, zum Beispiel auf Ebene einer GUI, zu machen die oft mit etwas einfacher zu benutzenden Funktionen für diese Aufgabe kommen.
-
hustbaer schrieb:
Oder du kannst die Gleitkommazahlen einfach als String einlesen, dann "," durch "." ersetzen den String dann als Gleitkommazahl einlesen.
Oder die Datei 'vorbereiten' indem du in einem Editor deiner Wahl 'Suchen und Ersetzen' aufrufst und alle Komma durch Punkte ersetzt?
Oder ist das keine Option?
Gruß,
-- Klaus.
-
hustbaer schrieb:
Oder du kannst die Gleitkommazahlen einfach als String einlesen, dann "," durch "." ersetzen den String dann als Gleitkommazahl einlesen.
Klaus82 schrieb:
Oder die Datei 'vorbereiten' indem du in einem Editor deiner Wahl 'Suchen und Ersetzen' aufrufst und alle Komma durch Punkte ersetzt?
Ich finde beide Ideen grauenhaft. Entweder richtig (Einleselogik des Streams anpassen) oder gar nicht. Diese beiden Vorschläge sind umständlich, unflexibel, fehleranfällig und gehen am eigentlichen Problem (Internationalisierung) vorbei (da sie bestenfalls Germanisieren).
-
Klar ist das grauenhaft. i18n in C++ ist aber grundsätzlich grauenhaft.
Und da der Herr Nikolaus offensichtlich nicht viel Plan von C++ hat, wollte ich diese grauenhafte - aber einfach umzusetzende - Möglichkeit auch erwähnen.
-
hustbaer schrieb:
Und da der Herr Nikolaus offensichtlich nicht viel Plan von C++ hat, wollte ich diese grauenhafte - aber einfach umzusetzende - Möglichkeit auch erwähnen.
Ok, ein löbliches Vorhaben
. Ich habe bei so etwas bloß immer die Befürchtung, dass man dem Anfänger damit den sprichwörtlichen goldenen Hammer in die Hand gibt (der in diesem Fall nicht einmal wirklich goldig wäre), was dann dazu führt, dass du in 10 Jahren zu ihm in die Firma wechselst und dann in dem 5 Millionen Zeilen Projekt die von ihm entwickelte Internationalisierung-durch-Suchen-und-Ersetzen weiter pflegen darfst
.
-
SeppJ schrieb:
Ich habe bei so etwas bloß immer die Befürchtung, dass man dem Anfänger damit den sprichwörtlichen goldenen Hammer in die Hand gibt (der in diesem Fall nicht einmal wirklich goldig wäre), was dann dazu führt, dass du in 10 Jahren zu ihm in die Firma wechselst und dann in dem 5 Millionen Zeilen Projekt die von ihm entwickelte Internationalisierung-durch-Suchen-und-Ersetzen weiter pflegen darfst
.Wer nach 10 Jahren Programmiererfahrung immer noch nicht selber geschnallt hat, dass das nicht beste Art ist, dem kann sowieso nicht geholfen werden (und anderen, die diesen Thread als Ausgangslage für ihre Internationalisierung der 5 Millionen Zeilen grossen Software nehmen).
Andereseits finde ich es in der Tat gefährlich, die locales der iostreams als die bestmögliche Lösung anzupreisen. Mir ist kein Projekt bekannt, dass diese effektiv verwendet und es würde mich auch sehr erstaunen, wenn das der Fall wäre. Man könnte eveneutell Boost.Locale erwähnen, aber selbst das wird meines Wissens nach kaum verwendet.
-
herrlöblich schrieb:
Andereseits finde ich es in der Tat gefährlich, die locales der iostreams als die bestmögliche Lösung anzupreisen. Mir ist kein Projekt bekannt, dass diese effektiv verwendet und es würde mich auch sehr erstaunen, wenn das der Fall wäre. Man könnte eveneutell Boost.Locale erwähnen, aber selbst das wird meines Wissens nach kaum verwendet.
Nein, das wollte ich definitiv nicht als die beste Lösung anpreisen. Es ist nur die Antwort auf die Frage. Die besten Lösungen sind im zweiten Absatz meiner ersten Antwort (da steht nicht umsonst, welche der Lösungen ich wählen würde).
-
Mit den 2 folgenden Zeilen hat es funktioniert, vielen Dank!

cin.imbue(locale("")); cout.imbue(locale(""));
-
Ich würde dir trotzdem empfehlen die Nutzer zu zwingen einen Punkt zu verwenden. Gibt genug Anwendungen die das so machen...

Und wenn jetzt ein User der das so gewohnt ist eine Zahl eingibt wird er vermutlich zuerst einen Punkt statt einen Komma nutzen, und damit kommt dein Programm auch wieder nicht klar. Insofern lieber die englische Version nutzen. Außerdem finde ich den Gedanken dass das Programm von der den Systemeinstellungen abhängig ist auch nicht so toll...
-
Ich bevorzuge die Zeichenersetzung Komma durch Punkt im Eingabestring. Der Anwender kann dann beide Möglichkeiten verwenden
und das Programm ist unabhängig von allen Ländereinstellungen. Was sollte dagegen sprechen?