2009-06-17 8 views
7

Ein häufiges internationales Problem ist die Konvertierung von doppelten Werten in Strings dargestellt. Dieses Zeug ist in vielen Bereichen zu finden.Doppelte Zeichenfolge Konvertierung und Gebietsschema

Beginnend mit CSV-Dateien, die entweder

comma separated 

oder

character separated 

genannt werden, weil sie manchmal wie

1.2,3.4 
5.6,6.4 

in englischen Regionen gespeichert sind oder

1,2;3,4 
5,6;6,4 

in beispielsweise deutschen Regionen.

Vor diesem Hintergrund ist es irgendwie notwendig zu wissen, dass die meisten std :: -Methoden vom Gebietsschema abhängig sind. Also werden sie in Deutschland "1,2" als 1.2 lesen und es als "1,2" zurückschreiben, aber mit einem englischen Betriebssystem wird es "1,2" als 1 lesen und es als "1" schreiben.

Da das Gebietsschema ein globaler Status der Anwendung ist, ist es keine gute Idee, es in eine andere Einstellung zu ändern; und hier haben wir einige Probleme, wenn ich eine deutsche CSV-Datei auf einer englischen Maschine lesen muss oder umgekehrt.

Es ist auch schwer, Code zu schreiben, der sich auf allen Maschinen gleich verhält. Der C++ - Stream ermöglicht eine Gebietsschemaeinstellung pro Stream.

können Sie einen Stream mit Std :: C-Verhalten initialisieren und nur den Dezimalpunkt ersetzen. Dies gibt mir die Möglichkeit, das Tausendertrennzeichen zu ignorieren, das ebenfalls in Kraft treten kann. Deutsch 1000.12 kann "1.000,12" werden; oder in Englisch "1000.12" endet in völliger Verwirrung. Auch ersetzen "," durch "." wird in dieser Situation nicht helfen.

Wenn ich mit atof und Freunden arbeiten kann ich

const char decimal_point = *(localeconv()->decimal_point); 

verwenden mein Verhalten kuppeln.

Also gibt es eine schreckliche Menge an Zeug nur für internationales Doppelverhalten. Selbst mein Visual Studio stößt auf Probleme, weil die deutsche Version 8,0 als Version in die vcproj-Datei schreiben will, während eine englische Version sie in 8.0 ändern möchte, was definitiv durch einen Vorfall passiert, weil in XML 8.0 definiert ist Länder der Welt.

Also wollte ich das Problem nur ein wenig beschreiben, um nach Aspekten zu fragen, die ich vielleicht ignoriert habe. Dinge, die ich kenne:

  • dezimal Pint ist locale abhängig
  • 000 Separator ist locale abhängig
  • Exponent locale

//     German  English  Also known 
// decimal point  ,   .    
// exponent   e/E   e/E   d/D 
// thousand sep  .   , 

Welches Land nutzt die Einstellung abhängig ist?Vielleicht können Sie mir einige interessante Beispiele hinzufügen, die ich bis jetzt nicht hatte.

+0

http://en.wikipedia.org/wiki/Decimal_point#Examples_of_use – Pod

Antwort

-1

Ich denke, Sie suchen nach Appendix D of The C++ Programming Language. Möglicherweise interessiert es Sie, dass mehrere Locales gleichzeitig in einem Programm verwendet werden können.

+0

Warum die downvote? –

2

Verwenden Sie niemals Atof (s). Es ist eine schnelle & Dirty Shortcut für Strtod (s, 0) ohne die Fehlermeldung. (Das Gleiche gilt für atoi() und strtol().)

Wenn eine Funktion beworben werden, um einen Fehlercode im Fall von Schwierigkeiten zurückzukehren, ich soll Scheck über diesen Code, ja, auch wenn die Kontrollen der dreifache Größe deines Codes und erzeugst Schmerzen in deinen Tippfingern, denn wenn du glaubst 'es kann mir nicht passieren mich', werden die Götter dich für deine Arroganz sicherlich bestrafen.

(Henry Spencer, "Zehn Gebote für den C-Programmierer", Gebot # 6)