2015-12-17 9 views
5

Ich lese einige X- und Y-Koordinaten aus einer XML-Datei. Die Koordinaten sehen so aus: 3.47, -1.54, .. und so weiter.Warum ändert Convert.ToDouble meinen Wert um den Faktor 1000?

Wenn ich den Wert einer doppelten variablen von

double x, y; 
x = Convert.ToDouble(reader["X"]); // X Value: 3.47 

zuweisen Der Wert wird 3470.00

Warum ist dies der Fall?

+9

Falsche Kultureinstellungen verwenden? Versuchen Sie 'Convert.ToDouble (reader [" x "], CultureInfo.InvariantCulture)' –

Antwort

3

Wie bereits erwähnt, ist das Problem die Kultureinstellungen. XML sollte mit invarianter Kultur arbeiten, deshalb sollten Sie nicht Convert Klasse verwenden (obwohl Sie, CultureInfo.InvariantCulture in jedem Anruf, der leicht vergessen werden kann, XmlConvert Class, die für Schreiben und Lesen Konvertierungen umfasst benötigt für XML-Inhalt.

Also in Ihrem Fall sollten Sie wirklich

x = XmlConvert.ToDouble(reader["X"]); 
+0

Beste Antwort, danke! – ManuKaracho

11

Convert.ToDouble Methode verwendet Ihre CurrentCulture Einstellungen standardmäßig wenn Sie nicht liefern jedeIFormatProvider.

Sieht aus wie Ihre CurrentCulture nicht . als NumberDecimalSeparator verwendet, aber es wird wahrscheinlich als NumberGroupSeparator verwendet. Aus diesem Grund Ihre Zeichenfolge analysiert als 3400 nicht 3.4

Als Lösung können Sie eine Kultur verwenden, die bereits. als NumberDecimalSeparator in einem zweiten Parameter Ihrer Convert.ToDouble Methode wie InvariantCulture hat.

double x; 
x = Convert.ToDouble("3.47", CultureInfo.InvariantCulture); // x will be 3.47 not 3470 

Für Ihre -1.54 Beispiel müssen Sie kombiniert AllowLeadingSign und AllowDecimalPoint Stile verwenden, um anzugeben. Leider, Convert.ToDouble hat keine keine Überladung, die NumberStyles als Parameter dauert.

Dafür können Sie stattdessen double.Parse Methode verwenden.

double x; 
x = double.Parse("-1.54", NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint, 
       CultureInfo.InvariantCulture); // x will be -1.54 
Verwandte Themen