选择不同的区域选项会改变c#中数学运算的结果

时间:2013-01-24 21:16:07

标签: c# globalization decimal-point regional-settings

我正在使用Visual Studio 2010.我的代码有一种奇怪的行为

使用此代码,我可以解析xml文件。

XDocument document = XDocument.Load("http://www.studiovincent.net/list.xml");
XElement resourcesElement = document.Root.Element("resources");
XElement resourceElementVincent = (from resourceElement in resourcesElement.Elements("resource")
                                           where resourceElement.Elements("field").Single(fieldElement => fieldElement.Attribute("name").Value == "name").Value == "Vincent"
                                           select resourceElement).Single();

decimal tasso = Math.Round(decimal.Parse(resourceElementVincent.Elements("field").Single(fieldElement => fieldElement.Attribute("name").Value == "age").Value) / Convert.ToInt64(1.00E+006), 6);


string gigi = Math.Round(41 * tasso, 4).ToString();
Console.WriteLine("{0}", gigi);
Console.ReadLine();

所有工作正常,直到我更改区域选项。如果我选择意大利语:

enter image description here

这是输出: 0,0013

enter image description here

如果我在区域选项中选择美国,则为OUTPUT: 0.0000

enter image description here

我不知道如何解决这个问题。

提前致谢。

3 个答案:

答案 0 :(得分:3)

decimal.Parse(string)使用当前的系统格式;从而

decimal.Parse(resourceElementVincent.Elements("field")
       .Single(fieldElement => fieldElement.Attribute("name").Value == "age")
       .Value)
当Vincent的年龄设置为0.27并且当前文化是意大利语(NumberDecimalSeparator是逗号)时,

将返回零。

但是,您可以使用decimal.Parse(string, IFormatProvider)方法,传递InvariantCulture(其中NumberDecimalSeparator是句点):

decimal.Parse(resourceElementVincent.Elements("field")
       .Single(fieldElement => fieldElement.Attribute("name").Value == "age")
       .Value, CultureInfo.InvariantCulture);

MSDN文档here

答案 1 :(得分:1)

我的猜测是1.00E + 006的解析取决于当前区域。

答案 2 :(得分:-1)

这很正常!欧洲语言使用小数点作为逗号,反之亦然。如果要一致地使用其中一个,可以将String.Format与特定文化一起设置,如下所示:

Format string by CultureInfo