我有这行代码:
System.Convert.ChangeType(input, destinationType, CultureString);
如果使用 de-DE 文化调用并且输入为 4,50 且destinationType 为 double,则返回 4.50。
如果我用 en-GB 调用它,它会将其转换为 450.00。
有没有办法让它返回 4.50 或抛出一个异常说你不能将 4,50 转换为双倍。
谢谢
我有这行代码:
System.Convert.ChangeType(input, destinationType, CultureString);
如果使用 de-DE 文化调用并且输入为 4,50 且destinationType 为 double,则返回 4.50。
如果我用 en-GB 调用它,它会将其转换为 450.00。
有没有办法让它返回 4.50 或抛出一个异常说你不能将 4,50 转换为双倍。
谢谢
正如MSDN对您正在使用的特定重载所指定的那样:
返回一个指定类型的对象,其值与指定对象等价。参数提供特定于区域性的格式信息。
换句话说,它试图了解如何根据文化的格式信息进行转换。因此,在de-DE4,50
中意味着相同的数字在en-GB中被标识(注意有一个句点不是逗号)。
在 en-GB 文化中使用逗号来谈论千位(例如可以写 4000 ),当解析 4,50 时,逗号被忽略,因此输出为 450。4.5
4.50
4,000
这就像2010 年 1 月 21 日的日期在美国被解析01/21/10
(mm/dd/yy) 而在英国被解析21/01/10
(dd/mm/yy)。
所以实际上,不应该提出任何例外,因为 4,50可以转换为双精度数,这取决于世界上的哪个地方:)
注意:当您需要与文化无关的转换时, C# 具有CultureInfo.InvariantCulture 。
如果您想抛出异常,请不要使用 ChangeType,Double.Parse
与NumberStyles
@ChrisF 在他的回答中解释的一样使用。例如,这将引发异常:
Double.Parse("4,50", NumberStyles.Float);
您应该使用double.Parse
而不是ChangeType
.
如果您不设置标志,您可以double.Parse
抛出异常:NumberStyles.AllowThousands
NumberStyles.AllowThousands 表示允许使用组分隔符。有效的组分隔符由当前 NumberFormatInfo 对象的 NumberGroupSeparator 或 CurrencyGroupSeparator 属性确定。
在这种情况下,您可以使用:
double result = double.Parse("4,50", numberStyle);
正如这里所说
要指定的典型值是 Float 与 AllowThousands 的组合。
因此,在您的情况下,您要确保未设置此标志。虽然这意味着您无法正确解析“4,500”。
通过设置标志,您可以告诉代码在解析字符串时简单地忽略千位分隔符。这意味着根据算法,以下字符串全部转换为 450:
450
45,0
4,50
450,
利用Double.Parse(input, style)
解析更加严格,并且System.Globalization.NumberStyles style
允许您准确指定您所做的并且不认为是数字。FormatException
如果它不喜欢字符串中的内容,它会抛出一个。