Zahlen mit Komma statt Punkt in eine Datei schreiben



  • Hi,

    wenn ich folgenden Code umsetze:

    ofstream myfile;
    myfile.open("text.txt");
    double zahl = 21214.14141;
    myfile << zahl;
    myfile.close();
    

    dann habe ich das Problem, dass die Zahl nicht mit Komma, sondern Punkt abgespeichert wird. Wie kann ich das ändern?

    DANKE!
    V.K.



  • Konvertiere deine Zahl mit Hilfe eines ostringstreams in einen String und ersetze dort mit der replace-Funktion deinen Punkt durch ein Komma.

    Du solltest allerdings bedenken, dass du beim Einlesen der Datei dann wieder das gleiche Problem hast und die Kommas durch Punkte ersetzen musst. 🤡



  • dem Stream ein deutsches Locale geben (wie genau du da rankommst, hängt vom Compiler ab - aber letztendlich brauchst du imbue(), um es einzuklinken).



  • Ajaw schrieb:

    Konvertiere deine Zahl mit Hilfe eines ostringstreams in einen String und ersetze dort mit der replace-Funktion deinen Punkt durch ein Komma.

    .. das solltest Du auf keinen Fall tun.

    VerbalKint schrieb:

    ... dann habe ich das Problem, dass die Zahl nicht mit Komma, sondern Punkt abgespeichert wird. Wie kann ich das ändern?

    So geht's:

    ofstream myfile("text.txt");
            myfile.imbue( locale("german") ); // der String 'german' kann je nach Umgebung variieren
            double zahl = 21214.14141;
            myfile << zahl;
    

    ggf. kannst Du mit myfile << setprecision( 10 ); dafür sorgen, dass alle 10 Stellen Deiner Zahl ausgegeben werden.

    Gruß
    Werner



  • Werner Salomon schrieb:

    Ajaw schrieb:

    Konvertiere deine Zahl mit Hilfe eines ostringstreams in einen String und ersetze dort mit der replace-Funktion deinen Punkt durch ein Komma.

    .. das solltest Du auf keinen Fall tun.

    Weil... ? 😕



  • Ajaw schrieb:

    Weil... ? 😕

    Weil es Sprachmittel dafür gibt? Eine Zahl mit Komma auszugeben heisst eine Zahl deutsch auszugeben (oder eben in einer Sprache, die ein Dezimalkomma verwendet). Dafür gibt es Locales.

    Im Übrigen erledigt sich das Einleseproblem so gleich mit, da die Locales auch da Einfluß nehmen.

    Aber zum Datenaustausch in Dateien würde ich grundsätzlich die C-Locale verwenden, da nicht immer garantiert ist, dass das was geschrieben wird auch wieder gelesen werden kann. Einfachstes Beispiel ist Französisch, wo der Tausendertrenner eine Leerstelle ist. Bekanntlich ist die Leerstelle aber auch Streamtrenner beim Lesen.



  • Wenn die Datei bzw. die Daten für den Menschen gedacht sind, kann man problemlos das Locale benutzen. Sobald die Daten bzw. Datei für die "computerische" (oh mein Gott...) Weiterverarbeitung gedacht sind, würde ich die Finger vom Locale lassen und es original abspeichern. Bei der Ausgabe auf den Bildschirm/Drucker kann man dann immer noch das Locale benutzen.



  • Ajaw schrieb:

    Weil... ? 😕

    weil die Umsetzung einer Zahl in eine Folge von Zeichen dann da ist, wo sie hingehört - nämlich im Stream. So erwischt man auch alle Zahlen, und nicht nur die die man vordergründig 'sieht'. Beispiele sind die komplexen Zahlen oder Ausdrücke wie

    vector< double > v;
        copy( v.begin(), v.end(), ostream_iterator< double >( outfile, " ") );
    

    Wenn man dabei jetzt jedesmal den Umweg über einen string mit replace( '.' -> ',' ) nehmen würde, so entsteht das, was man gemeinhin mit 'ugly code' bezeichnet. Fehler sind hier vorprogrammiert.

    LordJaxom schrieb:

    Aber zum Datenaustausch in Dateien würde ich grundsätzlich die C-Locale verwenden, ...

    man kann es sich leider in den wenigsten Fällen aussuchen

    LordJaxom schrieb:

    ... da nicht immer garantiert ist, dass das was geschrieben wird auch wieder gelesen werden kann. Einfachstes Beispiel ist Französisch, wo der Tausendertrenner eine Leerstelle ist. Bekanntlich ist die Leerstelle aber auch Streamtrenner beim Lesen.

    Stimmt - IO von complexen Zahlen auf 'deutsch' reicht auch schon, da hier das ',' auch der Trenner zwischen Real- und Imaginärteil ist.

    Gruß
    Werner



  • OK. Ich gebe mich geschlagen. Mach das bloss nicht mit ostringstreams. 🤡



  • Wird dann eigentlich vom OS abgefragt, wie es zu "übersetzen" ist, oder wird vom OS die Sprache ermittelt und daraufhin (auf der Seite vom stream) das Ding konvertiert?


Anmelden zum Antworten