1

我有这行代码:

System.Convert.ChangeType(input, destinationType, CultureString);

如果使用 de-DE 文化调用并且输入为 4,50 且destinationType 为 double,则返回 4.50。

如果我用 en-GB 调用它,它会将其转换为 450.00。

有没有办法让它返回 4.50 或抛出一个异常说你不能将 4,50 转换为双倍。

谢谢

4

3 回答 3

2

正如MSDN对您正在使用的特定重载所指定的那样:

返回一个指定类型的对象,其值与指定对象等价。参数提供特定于区域性的格式信息。

换句话说,它试图了解如何根据文化的格式信息进行转换。因此,在de-DE4,50中意味着相同的数字在en-GB中被标识(注意有一个点不是逗号)。 在 en-GB 文化中使用逗号来谈论千位(例如可以写 4000 ),当解析 4,50 时,逗号被忽略,因此输出为 450。4.54.50
4,000

这就像2010 年 1 月 21 日的日期在美国被解析01/21/10(mm/dd/yy) 而在英国被解析21/01/10(dd/mm/yy)。

所以实际上,不应该提出任何例外,因为 4,50可以转换为双精度数,这取决于世界上的哪个地方:)

注意:当您需要与文化无关的转换时, C# 具有CultureInfo.InvariantCulture 。

如果您想抛出异常,请不要使用 ChangeTypeDouble.ParseNumberStyles@ChrisF 在他的回答中解释的一样使用。例如,这将引发异常:

Double.Parse("4,50", NumberStyles.Float);
于 2012-12-21T15:49:21.690 回答
1

您应该使用double.Parse而不是ChangeType.

如果您不设置标志,您可以double.Parse抛出异常:NumberStyles.AllowThousands

NumberStyles.AllowThousands 表示允许使用组分隔符。有效的组分隔符由当前 NumberFormatInfo 对象的 NumberGroupSeparator 或 CurrencyGroupSeparator 属性确定。

MSDN 页面

在这种情况下,您可以使用:

double result = double.Parse("4,50", numberStyle);

正如这里所说

要指定的典型值是 Float 与 AllowThousands 的组合。

因此,在您的情况下,您要确保未设置此标志。虽然这意味着您无法正确解析“4,500”。

通过设置标志,您可以告诉代码在解析字符串时简单地忽略千位分隔符。这意味着根据算法,以下字符串全部转换为 450:

450
45,0
4,50
450,

于 2012-12-21T16:00:44.850 回答
0

利用Double.Parse(input, style)

解析更加严格,并且System.Globalization.NumberStyles style允许您准确指定您所做的并且不认为是数字。FormatException如果它不喜欢字符串中的内容,它会抛出一个。

于 2012-12-21T15:55:58.423 回答