2

我遇到了 XElement 和 Culture 的问题。

我的当地文化是法语。浮点值用逗号而不是点写入。

Console.WriteLine(1.1d);
//1,1

但是,当我在 XElement 中放一个双精度时,它以美国格式存储。

XElement myXmlElement = new XElement("ADoubleElement", 1.1d);
Console.WriteLine(myXmlElement.Value);
//1.1

因此,当我尝试解析 XElement 的值时,我得到一个 FormatException。

XElement myXmlElement = new XElement("ADoubleElement", 1.1d);
double myDouble = double.Parse(myXmlElement.Value);
//Throws a FormatException

我觉得这种行为真的很奇怪。当我写 XDoucment 时,它不是在应用程序或线程的文化中编写的,而是在美国文化中编写的。我错过了什么吗?我有一些解决方法可以按照我的预期行事,但我觉得它们不是很“干净”。

//This will work
XElement myXmlElement = new XElement("ADoubleElement", 1.1d.ToString());
double myDouble = double.Parse(myXmlElement.Value);
//This will also work but if I write XElement, it will not have the correct Culture
XElement myXmlElement = new XElement("ADoubleElement", 1.1d);
double myDouble = (double)myXmlElement;
4

2 回答 2

7

XML 规范描述了数据应该如何格式化,这就是为什么XElement不使用你的文化 - 它遵循 XML 规范(实际上可能与 相同InvariantCulture

这也是强制转换XElementdouble有效而double.Parse无效的原因:它遵循 XML 规范格式而不是本地格式。

于 2013-10-16T15:03:45.760 回答
2

XElement将始终InvariantCulture在转换为字符串或从字符串转换时使用。
这是 XML 旨在序列化数据,并且您不希望在跨文化移动时破坏它。

Parse()并默认ToString()使用CurrentCulture
这是因为这些功能旨在与希望以通常方式看到数字的用户交互时使用。

在调用或时,您应该始终明确地传递一种文化。Parse()ToString()

于 2013-10-16T15:03:39.077 回答