[我在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?
在您的问题中,文本中的双打使用逗号十进制分隔符格式化: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
我在Visual Studio和dotnetfiddle中运行了您的代码,并得到以下结果。
XmlConvert
我建议您检查文件的编码,并以相同的编码读取它。还要检查计算机上安装的本地化。