Double.Parse - 国际化问题

时间:2009-04-06 15:22:41

标签: c# string double culture cultureinfo

这让我发疯了。我在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中是一个逗号,但不应该把我传递给parse方法的文化信息并应用正确的格式转换?

如果我这样做

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

格式化现在是0,009。任何人

6 个答案:

答案 0 :(得分:20)

采取您提供的文化并应用正确的格式。你提供了一串“0.009”,并告诉它它是西班牙语...然后你抱怨说它正确地解释为西班牙语!当你知道它不是时,不要告诉它字符串是西班牙语。

你应该将Pars方法传递给被解析的字符串的文化,在这种情况下,它将是en-US或en-Gb或InvariantCulture。

答案 1 :(得分:10)

杰斯的写作对我有用。只为那些需要尝试如何获得“不变文化”的人:它看起来像这样

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

(第一个stackoverflow帖子,所以是的,相当边缘;)

答案 2 :(得分:4)

你倒退了。

当你说double d = Double.Parse(s, new CultureInfo("es-ES"));时,你要求.NET将你的字符串解析为double,假设字符串是在es-ES文化中写的。

在西班牙文化中,“。”是一个千位分隔符,所以“0.009”是9。

当你使用ToString()进行转换时,最后,它说使用西班牙文化将0.009转换为字符串,因此它使用“,”作为小数点分隔符,并得到“0,009”。行为是正确的。

我的猜测是你想将Double.Parse用于Invariant Culture,而ToString用于西班牙文化,所以0.009变为0,009。

答案 3 :(得分:3)

我认为你是以错误的方式解释它,在es-ES文化中,实际上只有很长的路要说9,就像“。”不是小数点分隔符,所以如果你要求使用es-ES文化解析字符串“0.009”,你应该得到deouble 9.0。如果你要求它解析“0,009”你应该得到0.009的两倍。

同样,如果你要求格式双重0.009,你应该在es-ES中得到字符串“0,009”。

答案 4 :(得分:2)

你错误地解析和格式化。第一次得到9而不是.009因为你在一个基于。的文化中形成了一个字符串,并使用一个基于文化的文化来解析它。您需要使用它创建的任何文化来解析它,然后使用您想要显示的任何文化格式化它。

答案 5 :(得分:1)

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

在es-ES文化中,“,”是小数点分隔符(不是“。”)