解析XML中的浮点值,失去小数位(C#)

问题描述 投票:0回答:2

[我在C#中有一个非常尴尬的行为(在Unity内部,使用VS2019),现在让我发疯了好几天了,非常感谢您的帮助。

我有一个非常简单的XML文件,在这种简单情况下,它仅包含一个根节点和几个属性:

<root bit_depth="8" end_datetime="737061.75" start_datetime="737061">
</root>

我尝试阅读它:

XmlDocument document = new XmlDocument();
document.Load( _projectFilePath );

string startTime = node.Attributes[ "start_datetime" ].Value;
Debug.Log( "1st::: Read startTime number: " + startTime );
double startTimeValue = double.Parse(startTime);
Debug.Log( "2nd::: Parse startTime number: " + startTimeValue  );

string endTime = node.Attributes[ "end_datetime" ].Value;
Debug.Log( "1st::: Read endTime number: " + endTime );
double endTimeValue = double.Parse(startTime);
Debug.Log( "2nd::: Parse endTime number: " + endTimeValue );

结果如下:

1st::: Read startTime number: 737061
2nd::: Parse startTime number: 737061

1st::: Read endTime number: 7,370618E+07
2nd::: Parse endTime number: 7370618000000

只是...为什么?!?!!?!?!当我显式解析一个双精度值时,为什么它将那个浮点数弄乱到7,370618E + 07?

c# xml parsing xml-parsing
2个回答
1
投票

在您的问题中,文本中的双打使用逗号十进制分隔符格式化:7,370618E+07

这意味着您计算机上的current locale(由Thread.CurrentCulture表示)使用此分隔符。

但是,XML文件中的数字是使用句点小数点分隔符格式化的:Thread.CurrentCulture

因此737061.75将无法正确解析它们,因为输入字符串使用针对当前线程区域性初始化的Double.Parse()对象中的格式信息来解释。

由于XML文件通常使用不变的区域性进行格式化,因此应使用Double.Parse()进行解析:

NumberFormatInfo

最好使用NumberFormatInfo类中的实用程序:

invariant settings

此类提供了在公共语言运行时类型和XML架构定义语言(XSD)类型之间进行转换的方法。转换数据类型时,返回的值与语言环境无关。因此,它封装了有关XML约定的详细信息,用于格式化原始类型。

最后,在您的代码中执行:

double startTimeValue = double.Parse(startTime, NumberFormatInfo.InvariantInfo);

double endTimeValue = double.Parse(endTime, NumberFormatInfo.InvariantInfo);

我认为这是您所输入的错字,应改为:

XmlConvert

0
投票

我在Visual Studio和dotnetfiddle中运行了您的代码,并得到以下结果。

XmlConvert

我建议您检查文件的编码,并以相同的编码读取它。还要检查计算机上安装的本地化。

© www.soinside.com 2019 - 2024. All rights reserved.