Double.Parse - 国际化问题

19

这让我疯了。我在一个ASP.NET 2.0 WebForm页面中有以下字符串。

string s = "0.009";

很简单。现在,如果我的语言环境是西班牙语 - 即“es-ES” - 并且我尝试将字符串转换为Double,我会执行以下操作:

double d = Double.Parse(s, new CultureInfo("es-ES"));

我希望得到的是0.009,但实际上得到了9。我知道.NET认为这是千位分隔符,在en-US中是逗号,但是它不应该使用我传递给解析方法的Culture Info并将正确的格式应用于转换吗?

如果我执行

double d = 0.009D;
string formatted = d.ToString(new CultureInfo("es-ES"));

formatted现在是0.009。有任何问题吗?


1
更多关于本问题以及其他本地化问题的详细信息,请访问http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html。 - Jeff Moser
6个回答

22

这段代码的作用是将您提供的文化风格应用到特定格式上。您提供了一个字符串"0.009"并告诉它这是西班牙语...然后您抱怨它正确地将其解释为西班牙语! 当您知道它不是西班牙语时,不要告诉它该字符串是西班牙语。

在使用Parse方法解析字符串时,您应传递相应的文化风格参数,本例中应为en-US、en-GB或InvariantCulture。


是的,我全都弄错了。谢谢大家的答案。真的很有帮助。 - oz.
没问题。我很乐意帮忙。如果我的回答有点尖锐,对此我很抱歉 - 我并不是有意这样说的,但现在重新阅读它,感觉像个讨厌鬼。 - Jeff Yates

10

Jess的写作对我很有帮助。对于任何需要尝试如何获得“不变文化”的人来说,它看起来像这样:

double d = Double.Parse(myString, CultureInfo.InvariantCulture);

(第一篇stackoverflow文章,所以是较边缘的;)


如果myString是4,5,那么上面的代码将给出45,但对于西班牙语不起作用。 - El0din
不应该也不能使用不变的文化。请参见https://learn.microsoft.com/en-us/dotnet/api/system.globalization.cultureinfo.invariantculture?view=net-5.0:"不变文化是与英语语言相关但与任何国家/地区无关的文化不敏感". 如果你知道你要处理的数字采用西班牙格式,你应该提供相应的CultureInfo:"new CultureInfo("es-ES")"。 - Nicolas78

4
你搞反了。
当你使用double d = Double.Parse(s, new CultureInfo("es-ES"));时,你要求.NET将你的字符串解析为一个double类型,并假设该字符串是按照西班牙文化写成的。
在西班牙文化中,“.”是千位分隔符,因此“0.009”表示9。
当你使用ToString()进行转换时,最终它会使用西班牙文化将0.009转换为字符串,因此使用“,”作为小数点分隔符,结果为“0,009”。这种行为是正确的。
我猜你想要使用Invariant Culture来执行Double.Parse操作,并使用西班牙文化来执行ToString操作,这样0.009就变成了0,009。

3
我认为你的理解方式有误,在西班牙文化中,0.009只是说9的一种表达方式,因为“.”不是小数分隔符,所以如果您要求使用es-ES文化解析字符串“0.009”,您应该得到双精度浮点数9.0。如果您要求解析“0,009”,则应该得到双精度浮点数0.009。
同样地,如果您要求将双精度浮点数0.009格式化,则在es-ES中应该得到字符串“0,009”。

2

您误解了解析和格式化的概念。第一次您得到的是9而不是0.009,是因为您使用基于"."的文化来格式化字符串,并使用基于","的文化进行解析。您需要使用创建该字符串时使用的文化来解析它,然后使用您想要显示的任何文化来格式化它。


1
double d = Double.Parse("0,009",
    NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands,
    CultureInfo.CreateSpecificCulture("es-ES"));

在西班牙文化中,逗号“,”是小数分隔符(不是“.”)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接