C# - XElement and Culture

本文关键字:Culture and XElement | 更新日期: 2023-09-27 18:35:42

我在XElement和文化方面遇到了问题。

我当地的文化是法国人。浮点值用逗号而不是点书写。

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;

C# - XElement and Culture

XML 规范

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

这也是为什么将XElement转换为double有效而double.Parse不起作用的原因:它遵循XML规范格式而不是本地格式。

XElement在转换为字符串或从字符串转换为字符串时将始终使用InvariantCulture
这是 XML 用于序列化数据,您不希望在跨区域性移动时中断它。

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

在调用 Parse()ToString() 时,应始终显式传递区域性。