AdSense

Mittwoch, 19. Juni 2013

C# - Punkt oder Komma Problem

(English version) Früher, in C war das einfach. Das Komma im deutschen wird einfach als Punkt eingegeben, fertig. Jeder Programmierer wusste "Alle Zahlen werden englisch eingetippt, also mit Punkt".

Tja... C# denkt, intelligent zu sein und akzeptiert, je nach Region, das Komma statt dem Punkt. Das sieht bei mir zum Beispiel folgendermaßen aus:

string stringGerman = "3,1415926";
string stringEnglish = "3.1415926";
double doubleGerman = Convert.ToDouble(stringGerman);
double doubleEnglish = Convert.ToDouble(stringEnglish);
System.Console.Write("{0} - {1}\n", doubleGerman, doubleEnglish);


Die Ausgabe ist: 3,1415926 - 31415926, er akzeptiert also den Punkt nicht. Dies hat schon öfters zu Verwirrung geführt, da man ja instinktiv Zahlen mit Punkt eingibt (wenn sie als Usereingabe zuerst ein string sind). Die Lösung ist zum Glück ziemlich simpel:

double doubleEnglish = Convert.ToDouble(stringEnglish, CultureInfo.InvariantCulture);

Damit sagt man dem Compiler, dass er die Schreibweise mit Punkt akzeptieren soll. Fügt man das bei beiden Convert.ToDouble() ein, so liest er den englischen string richtig (und den deutschen natürlich falsch).

Damit wäre die Richtung von string zu double also erledigt. Kommen wir zur Rückrichtung. Bei mir liefert eine .ToString()-Methode immer die Komma-Schreibweise. Will ich also Daten für Gnuplot oder ähnliches mit C# abspeichern, so klappt das nicht. Die Lösung ist hier aber auch ziemlich simpel. Man muss einfach der .ToString()-Methode den selben CultureInfo-Parameter übergeben wie der Convert.ToDouble()-Methode:

string numberEnglish = doubleVariable.ToString(CultureInfo.InvariantCulture);

1 Kommentar:

  1. Oh mein Gott hätte ich bei der Klasse CultureInfo doch nur mal weiter gelesen, habe mir eine Methode für eine Xamarin.Forms Android Taschenrechner_App geschrieben und zwar so :
    private void cultureInfoMethod(string oPer)
    {
    culturePruefung = zahl + " " + calc + " " + lab_rOperation.Text;

    if (CultureInfo.CurrentCulture.TwoLetterISOLanguageName.ToString() == "de")
    {
    splitCultPruef = culturePruefung.Replace('.', ',').Split(' ');
    }
    else

    if (CultureInfo.CurrentCulture.TwoLetterISOLanguageName.ToString() == "en")
    {
    splitCultPruef = culturePruefung.Replace(',', '.').Split(' ');
    }
    if (oPer == "+")
    {
    ergebnis = Convert.ToDouble(splitCultPruef[0]) + Convert.ToDouble(splitCultPruef[2]);
    }
    if (oPer == "-")
    {
    ergebnis = Convert.ToDouble(splitCultPruef[0]) - Convert.ToDouble(splitCultPruef[2]);
    }
    if (oPer == "*")
    {
    ergebnis = Convert.ToDouble(splitCultPruef[0]) * Convert.ToDouble(splitCultPruef[2]);
    }
    if (oPer == "/")
    {
    ergebnis = Convert.ToDouble(splitCultPruef[0]) / Convert.ToDouble(splitCultPruef[2]);
    }
    }
    Das war wohl sehr umständlich :). Aber nun habe ich wieder was gelernt, Danke.

    AntwortenLöschen