2017-02-19 5 views
2

Ich muss eine CVS-Datei mit Zahlen drucken. Wenn die Datei gedruckt wird, habe ich Nummern mit Punkten, aber ich brauche sie mit Kommas.C++ Wie in einer Datei eine doppelte Dezimalzahl mit Komma (anstelle von Punkt) gedruckt werden

Hier ein Beispiel. Wenn ich diese Nummer im Terminal mit Locale-Methode drucke, erhalte ich eine Nummer mit Komma, aber in der Datei habe ich die gleiche Nummer, aber mit Punkt. Ich verstehe nicht warum. Wie könnte ich tun?

#include <iostream> 
#include <locale> 
#include <string>  // std::string, std::to_string 
#include <fstream> 
using namespace std; 
int main() 
{ 
    double x = 2.87; 
    std::setlocale(LC_NUMERIC, "de_DE"); 
    std::cout.imbue(std::locale("")); 
    std::cout << x << std::endl; 
    ofstream outputfile ("out.csv"); 
    if (outputfile.is_open()) 
     { 
      outputfile <<to_string(x)<<"\n\n"; 
     } 
    return 0; 
} 

Vielen Dank im Voraus.

+2

übertragen Sie das Ofstream-Objekt, nicht Cout. –

+0

@Neil [scheint nicht zu helfen] (http://coliru.stacked-crooked.com/a/2947e8488c8fb6a2). –

+0

Beachten Sie, dass Sie '' für 'std :: setlocale' angeben müssen. Es funktioniert zwar ohne den Header, aber es gibt keine Garantie (zum Beispiel kompiliert es nicht ohne es in Visual C++). –

Antwort

0

Locales sind systemspezifisch. Sie haben wahrscheinlich gerade einen Tippfehler gemacht; versuchen Sie "de-DE", die wahrscheinlich funktionieren wird (zumindest tut es auf meinem Windows).


Allerdings, wenn Ihr Programm nicht von Natur aus Deutsch-centric ist, dann die deutsche locale missbrauchen nur für den Nebeneffekt einer spezifischen Komma Charakter bekommen ist schlecht Programmierstil, glaube ich.

Hier ist eine alternative Lösung mit std::numpunct::do_decimal_point:

#include <string> 
#include <fstream> 
#include <locale> 

struct Comma final : std::numpunct<char> 
{ 
    char do_decimal_point() const override { return ','; } 
}; 

int main() 
{ 
    std::ofstream os("out.csv"); 
    os.imbue(std::locale(std::locale::classic(), new Comma)); 
    double d = 2.87; 
    os << d << '\n'; // prints 2,87 into the file 
} 

Dieser Code ausdrücklich bestimmt, dass sie will nur den Standard C++ Formatierung mit nur dem Komma Zeichen mit ',' ersetzt. Es bezieht sich nicht auf bestimmte Länder oder Sprachen oder systemabhängige Eigenschaften.

2

Ihr Problem ist, dass std::to_string() die C-Locale-Bibliotheken verwendet. Es scheint, dass "de_DE" kein gültiges Gebietsschema auf Ihrem Computer (oder Coliru) ist, was dazu führt, dass das Standard-C-Gebietsschema verwendet wird und . verwendet wird. Die Lösung ist "de_DE.UTF-8" zu verwenden. Nebenbei wird die Verwendung von "" für std::locale nicht immer Kommas erzeugen; Stattdessen hängt es von der Ländereinstellung für Ihren Computer ab.

+0

[Interessant!] (Http://coliru.stacked-crooked.com/a/1fe5711da15e03f1) –

+0

Genauer gesagt ist 'std :: to_string' definiert, um im Sinne von' sprintf' zu arbeiten , und 'sprintf' verwendet die C-Locale-Bibliotheken. –

Verwandte Themen