【问题标题】:Selecting different regional options changes result of the math operation in c#在c#中选择不同的区域选项会改变数学运算的结果
【发布时间】:2013-01-24 21:16:06
【问题描述】:

我正在使用 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();

一切正常,直到我更改区域选项。如果我选择意大利语:

这是输出:0,0013

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

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

提前致谢。

【问题讨论】:

  • 您是否有意将其缩短为四个零?即0000?可能是某处存在舍入问题,但由于允许输出的长度而将其切断。看看你是否可以增加输出的长度,你可能会发现以前没有显示的“隐藏”值。如果是这种情况,请更改为相应区域解析输出的方式。

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


【解决方案1】:

decimal.Parse(string)使用当前系统格式;因此

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

当文森特的年龄设置为 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.

【讨论】:

  • 好的,谢谢你的信息,但我不明白如果我设置意大利语,我会得到这个输出:0,0013,如果我设置美国,我会得到这个结果:0.0000
【解决方案2】:

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

【讨论】:

  • 你说对了吗,1.00E+006 取决于当前区域,谢谢
【解决方案3】:

这很正常!欧洲语言使用小数点作为逗号,反之亦然。如果您想始终使用其中一种,可以结合 String.Format 设置特定的文化,如下所示:

Format string by CultureInfo

【讨论】:

  • 好的,但我希望这段代码适用于所有区域选项,我不明白,所以我需要添加它。 :(
  • 他的问题不是, vs .,他得到的结果完全不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多