2013-06-19 16 views
7

In einem Projekt, an dem ich gerade arbeite, verbinde ich mich mit einer proprietären dynamischen Bibliothek. Sobald ich die Funktion initialize der Bibliothek starte, ändert sich das Verhalten der Protokollierung und des Druckens von Zahlen.Deaktivieren Sie Kommas in cout?

Kommas wurden an jeder dritten Dezimalstelle eingefügt. Ie.

cout << 123456789 << endl 

verwendet 123456789 auszudrucken und druckt es jetzt 123,456,789. Das ist furchtbar nervig, weil dieses Verhalten nicht das ist, was ich will.

Nach einigen Recherchen vermute ich ein Gebietsschema Problem. Ich habe versucht, diese Codezeile verwenden, nachdem die initialize Funktion aufrufen

setlocale(LC_ALL,"C"); 

dachte, es könnte meine lokalen auf den Standard zurücksetzen; aber ohne Erfolg. Die Kommas bestehen weiter !!

Was fehlt mir?

Ich habe eine verwandte folgen auf Frage here.

Antwort

5

Sie können das Gebietsschema für einen Stream unabhängig von dem mit setlocale festgelegten Gebietsschema festlegen. Versuchen Sie std::cout.imbue(std::locale("C"));

+0

das funktionierte gut für lokale Variablen in meinem Haupt! Die ausführbare Datei, die ich ausführe, ist jedoch auch mit mehr als 10 benutzerdefinierten Bibliotheken verbunden. Der Komma-Fehler hat sich leider auch in die gemeinsamen Bibliotheken 'stringstreams' und' couts' verbreitet. Gibt es eine bessere Möglichkeit, das Local global zu setzen, statt den gesamten Quellcode für meine Bibliotheken zu durchsuchen und 'imbue (std :: locale (" C "))' für jeden gefundenen String-Stream hinzuzufügen? – dinkelk

+0

Ich habe die Frage genauer bearbeitet. – dinkelk

2

Wenn Sie nur die Kommas loswerden möchten, können Sie auch die aktuelle std::numpunct ersetzen, die es wahrscheinlich mit dem Standard verursacht, der nicht überschreibt do_grouping.

std::cout.imbue(std::locale(std::cout.getloc(), new std::numpunct<char>())); 
+0

@ Jesse Gut, danke für den Vorschlag. Dies funktioniert gut für einige meiner Fälle. Siehe meine Bearbeitung oben. – dinkelk

+0

@dinkelk Sie sollten nur eine Frage per Post stellen. Ich schlage vor, Sie erstellen eine neue Frage, die das Problem anspricht. :) – 0x499602D2

+0

@ 0x499602D2 Die Antworten hier haben mein Problem nicht vollständig behoben. Die Frage hat sich nicht geändert, nur die Besonderheiten. – dinkelk