C# - XElement和文化

时间:2013-10-16 14:58:38

标签: c# .net xelement culture

我遇到了XElement和Culture的问题。

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

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

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

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;

2 个答案:

答案 0 :(得分:5)

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

这也是为什么将XElement投放到double并且double.Parse没有效果的原因:它遵循XML规范格式而不是本地格式。

答案 1 :(得分:2)

转换为字符串或从字符串转换时,

XElement将始终使用InvariantCulture 这是XML用于序列化数据,并且您不希望在跨文化移动时中断数据。

默认情况下,

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

在致电Parse()ToString()时,您应always明确传递文化。