Double.Parse – 国际化问题
这真让我抓狂。 我在ASP.NET 2.0 WebForm页面中有以下字符串
string s = "0.009";
很简单。 现在,如果我的文化是西class牙语 – 这是“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。 任何人?
它正在采用您提供的文化并应用正确的格式。 你提供了一串“0.009”并告诉它它是西class牙语…然后你抱怨说它正确地解释为西class牙语! 当你知道它不是时,不要告诉它字符串是西class牙语。
您应该将Pars方法传递给正在解析的字符串的文化,在这种情况下,它将是en-US或en-Gb或InvariantCulture。
杰斯的写作对我有用。 只为那些需要尝试如何获得“不变文化”的人:它看起来如此
double d = Double.Parse(myString, CultureInfo.InvariantCulture);
(第一个stackoverflowpost,所以是的,相当边缘;)
你倒退了。
当你说double d = Double.Parse(s, new CultureInfo("es-ES"));
,您要求.NET将您的字符串解析为double,假设该字符串是在es-ES文化中编写的。
在西class牙文化中,“。” 是一个千位分隔符,所以“0.009”是9。
当你使用ToString()进行转换时,最后,它使用西class牙文化将0.009转换为字符串,因此它使用“,”作为小数分隔符,并得到“0,009”。 行为是正确的。
我的猜测是你想使用Double.Parse和Invariant Culture,以及ToString和西class牙文化,所以0.009变成0,009。
我认为你正在以错误的方式解释它,在es-ES文化中,实际上只有很长的路要说9,就像“。” 不是小数分隔符,所以如果你要求使用es-ES文化解析字符串“0.009”,你应该得到deouble 9.0。 如果你要求它解析“0,009”你应该得到0.009的两倍。
同样,如果你要求它格式化双重0.009,你应该在es-ES中得到字符串“0,009”。
你错误地解析和格式化。 第一次得到9而不是.009,因为你在一个基于。的文化中形成一个字符串并使用基于文化的文化进行解析。 您需要使用它创建的任何文化来解析它,然后使用您想要显示的任何文化格式化它。
double d = Double.Parse("0,009", NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, CultureInfo.CreateSpecificCulture("es-ES"));
在es-ES文化中,“,”是十进制分配器(不是“。”)