2015-12-17 53 views
5

我正在从XML文件读取一些x和y坐标。为什么Convert.ToDouble将1000的值更改为我的值?

坐标看起来像这样3.47-1.54,..等等。

当我通过

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

值分配给双变量的值变成3470.00

为什么会出现这种情况?

+9

错误的文化设置?尝试'Convert.ToDouble(reader [“x”],CultureInfo.InvariantCulture)' –

回答

3

正如其他人已经提到,问题是文化背景。 XML应该与不变的文化一起工作,这就是为什么你不应该使用Convert类(尽管你可以在每次调用中传递CultureInfo.InvariantCulture,这很容易被忘记),但是专门为此提供了XmlConvert Class,它涵盖了写入和读取转换XML内容需要。

所以你的情况应该要使用

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

最佳答案,谢谢! – ManuKaracho

11

Convert.ToDouble方法使用您的CurrentCulture设置默认如果你不提供任何IFormatProvider

看起来像你的CurrentCulture不使用.作为NumberDecimalSeparator,但它可能用作NumberGroupSeparator。这就是为什么你的字符串被解析为34003.4

作为一个解决方案,你可以使用已经.在你Convert.ToDouble方法像InvariantCulture的第二个参数NumberDecimalSeparator的文化。

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

为了您-1.54例如,你需要指定要使用组合AllowLeadingSignAllowDecimalPoint风格。 不幸的是,Convert.ToDouble没有任何过载,其中NumberStyles作为参数。

为此,您可以改为使用double.Parse方法。

double x; 
x = double.Parse("-1.54", NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint, 
       CultureInfo.InvariantCulture); // x will be -1.54 
相关问题