18

这真让我抓狂。我在 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 中是逗号,但它不应该将我传递给解析方法的文化信息应用到转换?

如果我做

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

格式化现在是 0,009。有人吗?

4

6 回答 6

21

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

您应该将要解析的字符串的区域性传递给 Parse 方法,在本例中为 en-US 或 en-Gb 或 InvariantCulture。

于 2009-04-06T15:26:29.247 回答
10

杰西的作品对我有用。仅适用于需要尝试如何获得“不变文化”的任何人:看起来像这样

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

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

于 2010-05-19T21:25:39.890 回答
4

你倒过来了。

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

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

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

我的猜测是您想将 Double.Parse 与 Invariant Culture 一起使用,并将 ToString 与西班牙文化一起使用,因此 0.009 变为 0,009。

于 2009-04-06T15:26:57.453 回答
3

我认为您对它的解释是错误的,在 es-ES 文化中,0.009 实际上只是将 9 称为“。”。不是小数点分隔符,因此如果您要求使用 es-ES 文化解析字符串“0.009”,您确实应该得到 deouble 9.0。如果你让它解析“0,009”,你应该得到一个 0.009 的两倍。

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

于 2009-04-06T15:29:39.130 回答
2

您错误地解析和格式化。您第一次得到 9 而不是 .009,因为您采用基于 . 的文化格式的字符串并使用基于 , 的文化解析它。您需要使用创建它的任何文化对其进行解析,然后使用您想要显示的任何文化对其进行格式化。

于 2009-04-06T15:27:30.493 回答
1
double d = Double.Parse("0,009",
    NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands,
    CultureInfo.CreateSpecificCulture("es-ES"));

在 es-ES 文化中,“,”是十进制分隔符(不是“.”)

于 2009-04-06T15:32:05.427 回答