为什么 Convert.ToDouble 将我的值更改为 1000 倍?
Why does Convert.ToDouble change my Value by factor 1000?
我正在从 XML 文件中读取一些 x 和 y 坐标。
坐标看起来像这样 3.47
、-1.54
、.. 等等。
当我通过
将值赋给双变量时
double x, y;
x = Convert.ToDouble(reader["X"]); // X Value: 3.47
值变为 3470.00
为什么会这样?
Convert.ToDouble
方法使用您的 CurrentCulture
设置 默认情况下 如果您不提供 any IFormatProvider
.
看起来你的 CurrentCulture
没有使用 .
作为 NumberDecimalSeparator
but it probably uses as a NumberGroupSeparator
。这就是为什么您的字符串被解析为 3400
而不是 3.4
作为解决方案,您可以使用 已经 具有 .
的文化作为 Convert.ToDouble
的第二个参数中的 NumberDecimalSeparator
像 InvariantCulture
.
这样的方法
double x;
x = Convert.ToDouble("3.47", CultureInfo.InvariantCulture); // x will be 3.47 not 3470
对于您的 -1.54
示例,您需要指定使用 AllowLeadingSign
和 AllowDecimalPoint
组合样式。 不幸的是,Convert.ToDouble
没有any 重载以NumberStyles
作为参数。
为此,您可以改用 double.Parse
方法。
double x;
x = double.Parse("-1.54", NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint,
CultureInfo.InvariantCulture); // x will be -1.54
正如其他人已经提到的,问题出在文化设置上。 XML 应该与不变文化一起工作,这就是为什么你不应该使用 Convert
class(尽管你可以,在每次调用中传递 CultureInfo.InvariantCulture
,这很容易被遗忘) ,但专门为此目的提供的 XmlConvert Class 涵盖 XML 内容所需的写入和读取转换。
所以在你的情况下你真的应该使用
x = XmlConvert.ToDouble(reader["X"]);
我正在从 XML 文件中读取一些 x 和 y 坐标。
坐标看起来像这样 3.47
、-1.54
、.. 等等。
当我通过
将值赋给双变量时double x, y;
x = Convert.ToDouble(reader["X"]); // X Value: 3.47
值变为 3470.00
为什么会这样?
Convert.ToDouble
方法使用您的 CurrentCulture
设置 默认情况下 如果您不提供 any IFormatProvider
.
看起来你的 CurrentCulture
没有使用 .
作为 NumberDecimalSeparator
but it probably uses as a NumberGroupSeparator
。这就是为什么您的字符串被解析为 3400
而不是 3.4
作为解决方案,您可以使用 已经 具有 .
的文化作为 Convert.ToDouble
的第二个参数中的 NumberDecimalSeparator
像 InvariantCulture
.
double x;
x = Convert.ToDouble("3.47", CultureInfo.InvariantCulture); // x will be 3.47 not 3470
对于您的 -1.54
示例,您需要指定使用 AllowLeadingSign
和 AllowDecimalPoint
组合样式。 不幸的是,Convert.ToDouble
没有any 重载以NumberStyles
作为参数。
为此,您可以改用 double.Parse
方法。
double x;
x = double.Parse("-1.54", NumberStyles.AllowLeadingSign | NumberStyles.AllowDecimalPoint,
CultureInfo.InvariantCulture); // x will be -1.54
正如其他人已经提到的,问题出在文化设置上。 XML 应该与不变文化一起工作,这就是为什么你不应该使用 Convert
class(尽管你可以,在每次调用中传递 CultureInfo.InvariantCulture
,这很容易被遗忘) ,但专门为此目的提供的 XmlConvert Class 涵盖 XML 内容所需的写入和读取转换。
所以在你的情况下你真的应该使用
x = XmlConvert.ToDouble(reader["X"]);