Wie kann ich das Dezimaltrennzeichen auf ein Komma setzen?

8

Ich möchte pi als 3,141592 anstatt als 3.141592 lesen und schreiben, da die Verwendung des Kommas in vielen europäischen Ländern üblich ist. Wie kann ich dies mit iostream s erreichen? Mit anderen Worten

%Vor%

sollte drucken

%Vor%

zur Standardausgabe.

    
Ralph Tandetzky 05.03.2013, 10:00
quelle

2 Antworten

14

Sie sollten basic_ios::imbue verwenden, um das bevorzugte Gebietsschema festzulegen.

Sehen Sie sich hier Ссылка

an

Mit Locales können Sie den bevorzugten Weg des Benutzers wählen. Wenn ein Computer in Italien Komma verwendet, um Dezimalziffern zu trennen, wird der Punkt in den USA immer noch verwendet. Die Verwendung von Gebietsschemas ist eine gute Übung.

Aber wenn Sie explizit die Verwendung des Kommas erzwingen wollen, werfen Sie einen Blick hier: Ссылка

Hier ein kleines Beispiel, das ich gerade mit g ++ gemacht habe, das das char ',' erzwingt (die Übergabe des Trennzeichens als Template Argument ist nur zum Spaß, nicht wirklich notwendig)

%Vor%

Beachten Sie, dass ich mit cout.getloc() nur eine einzelne Facette im aktuell eingestellten Gebietsschema überschreiben möchte, das heißt, in den aktuellen Gebietsschemaeinstellungen von cout ändere ich nur, wie die Interpunktion ausgeführt wird.

do_decimal_point ist eine virtuelle Funktion von std::numpunct , die Sie neu definieren können, um Ihr benutzerdefiniertes Trennzeichen bereitzustellen. Diese virtuelle Funktion wird von numpunct::decimal_point beim Drucken Ihrer Nummer verwendet.

    
AkiRoss 05.03.2013, 10:25
quelle
9

Wie @AkiRoss sagte, müssen Sie Gebietsschemas verwenden. Im Allgemeinen , in jedem Programm schreiben Sie, eine der allerersten Aktionen in main sollte sein, das globale Gebietsschema auf die Wahl des Benutzers zu setzen etwas wie:

%Vor%

Dies sollte systematisch sein, in jedem Programm, das interagiert mit einem menschlichen Benutzer. Alle danach geöffneten Dateien werden wird automatisch mit dem korrekten Gebietsschema versehen.

Alternativ können Sie das gewünschte Gebietsschema explizit angeben Verwenden Sie:

%Vor%

Das Problem dabei ist, dass es keinen Standard für das Gebietsschema gibt Namen. Etwas wie "it_IT.UTF-8" entspricht dem Posix Standard und wird im Internet verwendet; Windows hat traditionell verwendet ein anderes Format (obwohl neuere Windows scheinen akzeptiere dieses Format auch).

Was std::cin , std::cout und std::cerr übrig lässt. Diese sind geöffnet, bevor Sie main eingeben, und muss daher mit der neues Gebietsschema (Um eine Kopie des aktuellen globalen Gebietsschemas zu erhalten, verwenden Sie der Standardkonstruktor von std::locale .)

Wenn Sie schließlich Binärdateien öffnen, sollten Sie sich dessen bewusst sein wird auch mit dem globalen Gebietsschema versehen sein. Was kann Code tun Übersetzung. In solchen Fällen sollten Sie sie explizit hinzufügen mit std::locale::classic() , oder erstellen Sie ein neues Gebietsschema durch Zusammenführen Die codecvt Facette von std::locale::classic() mit der anderen Facetten des globalen Gebietsschemas. ( std::locale hat spezielle Funktionen und Konstruktoren dafür.)

    
James Kanze 05.03.2013 10:47
quelle