Fließkommazahl kulturunabhängig in einen String wandeln

Speichert man Fließkommazahlen auf unterschiedlichen Systemen als String ab, kommt es vor, dass diese kulturabhängig formatiert werden. Beim Parsen solcher Strings treten dann Fehler auf, weil das System z.B. nicht mit dem Decimalseparator klarkommt.

Das Problem kann man umgehen, indem man die Strings mittels CultureInfo.InvariantCulture umwandelt:

double v = 3.14;

string value = v.ToString(CultureInfo.InvariantCulture); // value == "3.14"

Das Einlesen muss dann ebenfalls über CultureInfo.InvariantCulture erfolgen:

string value = "3.14";
double dValue = 0.0;
if (double.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out dValue))
{
    ...
}

String zu Typ wandeln (Parse, TryParse)

Einfache Beispiele

// Beispiele für Parse
int i = int.Parse("-100");
uint ui = uint.Parse("100");
long l = long.Parse("100");
float f = float.Parse("100,1");
double d = double.Parse("-100,1");
bool b = bool.Parse("True");

// Beispiele für TryParse
bool bValue = true;
if (bool.TryParse("False", out bValue ))
{
    ...
}

double dValue;
if (double.TryParse("0,45", out dValue))
{
    ...
}

Komplexere Beispiele

Häufig kommt es vor, dass z.B. CSV-Dateien eingelesen werden müssen und der vorhandene Datenbestand Werte mit unterschiedlichsten Dezimaltrennzeichen aufweist. Daher ist es wichtig entsprechend dem Dezimaltrennzeichen eine passende Konvertierungsfunktion zu schreiben.

// kulturabhängig Fließkommazahlen einlesen:
// Fließkommazahlen entsprechend der Culture des Hostsystems einlesen:
if (double.TryParse("0,45", NumberStyles.Float, new CultureInfo(CultureInfo.CurrentCulture.Name, false), out dValue))
{
    ...
}

// kulturunabhängig Fließkommazahlen einlesen:
// wenn Fließkommazahlen, die mit "." anstelle von "," getrennt sind, auf einem deutschsprachigen Hostsystem eingelesen werden sollen:
if (double.TryParse("0.45", NumberStyles.Float, CultureInfo.InvariantCulture, out dValue))
{
    ...
}