为什么Convert.ToDouble将我的值更改为1000倍
本文关键字:1000倍 我的 Convert ToDouble 为什么 | 更新日期: 2023-09-27 18:27:06
我正在从XML文件中读取一些x和y坐标。
坐标看起来像3.47
、-1.54
、。。等等
当我通过将值分配给双变量时
double x, y;
x = Convert.ToDouble(reader["X"]); // X Value: 3.47
值变为3470.00
为什么会出现这种情况?
Convert.ToDouble
方法默认使用您的CurrentCulture
设置,如果您没有提供任何IFormatProvider
。
看起来您的CurrentCulture
没有将.
用作NumberDecimalSeparator
,但它可能用作NumberGroupSeparator
。这就是为什么您的字符串被解析为3400
而不是3.4
作为解决方案,您可以在Convert.ToDouble
方法的第二个参数(如InvariantCulture
)中使用已经具有.
的区域性作为NumberDecimalSeparator
。
double x;
x = Convert.ToDouble("3.47", CultureInfo.InvariantCulture); // x will be 3.47 not 3470
对于-1.54
示例,需要指定使用组合的AllowLeadingSign
和AllowDecimalPoint
样式不幸的是,Convert.ToDouble
没有任何以NumberStyles
为参数的过载。
为此,您可以使用double.Parse
方法。
double x;
x = double.Parse("-1.54", NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint,
CultureInfo.InvariantCulture); // x will be -1.54
正如其他人已经提到的,问题在于区域性设置。XML应该使用不变的区域性,这就是为什么您不应该使用Convert
类(尽管您可以,在每次调用中都传递CultureInfo.InvariantCulture
,这很容易被忘记),而是专门为此提供的XmlConvert类,它涵盖了XML内容所需的写和读转换。
所以在你的情况下,你真的应该使用
x = XmlConvert.ToDouble(reader["X"]);