为什么Convert.ToDouble将我的价值改变1000倍?

Man*_*cho 5 c# double type-conversion

我正在从XML文件中读取一些x和y坐标.

坐标这个样子3.47,-1.54..等等.

当我将值赋值给double变量时

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

价值变成了 3470.00

为什么会这样?

Son*_*nül 11

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

看起来你CurrentCulture不会.用作a,NumberDecimalSeparator但它可能用作a NumberGroupSeparator.这就是为什么你的字符串解析为3400没有3.4

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

double x;
x = Convert.ToDouble("3.47", CultureInfo.InvariantCulture); // x will be 3.47 not 3470
Run Code Online (Sandbox Code Playgroud)

对于您的-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
Run Code Online (Sandbox Code Playgroud)


Iva*_*oev 3

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

所以在你的情况下你应该真正使用

x = XmlConvert.ToDouble(reader["X"]);
Run Code Online (Sandbox Code Playgroud)