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;
XML 规范
描述了数据应该如何格式化,这就是为什么XElement
不使用您的区域性 - 它遵循 XML 规范(实际上可能与 InvariantCulture
相同)
这也是为什么将XElement
转换为double
有效而double.Parse
不起作用的原因:它遵循XML规范格式而不是本地格式。
XElement
在转换为字符串或从字符串转换为字符串时将始终使用InvariantCulture
。
这是 XML 用于序列化数据,您不希望在跨区域性移动时中断它。
默认情况下,Parse()
和ToString()
使用CurrentCulture
。
这是因为这些功能旨在与用户交互时使用,用户希望以通常的方式查看数字。
在调用 Parse()
或 ToString()
时,应始终显式传递区域性。