C# Decimal.Parse逗号问题

3

我需要将一个字符串解析为十进制数(decimal),并且它可能会用于英国或欧洲文化环境。

在欧洲文化环境中,2,00 将表示为 2

然而,在英国文化环境中,2,00 将无效,因为逗号代表千位分隔符。

如果使用:

Double.Parse("20,50", new CultureInfo("en-GB")) 

它返回2050

我本以为它会抛出一个无效异常。

有人可以帮忙吗?


1
我得到的是2050,而不是20.50。你是否在控制面板中更改了英国区域设置,并将小数分隔符设置为, - Oded
我的默认控制面板设置是英语(英国),小数点符号为.。 - sianabanana
即使您得到了2050年的日期,我仍然认为它是不正确的。应该将其作为无效格式丢弃。 - sianabanana
对于您来说,它可能是不正确的,但这是预期的行为。此程序运行的默认文化是什么?该帐户是否更改了设置? - Oded
我搞错了,我确实得到了2050,但这仍然对我来说似乎是错误的。对我的用户来说,它肯定是错误的。他们在GB地区设置,不应该允许他们输入无效数字。在这个位置添加一个逗号是无效的吗? - sianabanana
你可能会这样想,但事实并非如此。解析器对,的位置是宽容的 - 这可能是因为它有两个用途。如果一个字符串不应该包含,,你需要自己进行测试并抛出异常。 - Oded
3个回答

3

您不应该收到异常,因为,是解析字符串中的有效字符(正如您所说,它被解释为千位分隔符)。

然而,我看到相同代码段的结果是2050,而不是20.50

只有在控制面板手动更改了该区域的小数分隔符为,且千位分隔符不是,时,我才会期望在en-GB文化中看到您的结果。


3
我认为这个问题是:为什么这段代码能够运行?而不是如何修复它 :) - Samy Arous

1
问题在于,在英国文化中,“2,00”应该是无效的,但它解析它时好像使用的是欧洲文化。
我希望它抛出一个异常。
相比之下,Double.Parse("20.50", new CultureInfo("fr-FR"))会抛出异常,因为小数点是无效的。
那么为什么Double.Parse("20,50", new CultureInfo("en-GB"))不是这样呢?

0
从更新的问题中,我可以看出英国文化可能使用逗号(,)作为可能的位置分隔符,例如2,000代表2000,2,000,000代表2000000。但它也可以是2,0,0,0,仍然是2000。
从这个角度来看,有三种可能的情况:
1. 您始终以本地格式接收数据,那么就没有问题,您只需按原样解析字符串(但有一个陷阱-用户可以更改字符串格式选项,因此最好创建新的默认本地文化)。 2. 您以预定义的格式接收数据,然后使用一些固定的文化来解析字符串。 3. 相对于本地,您以未知格式接收数据,即您可以接收本地和非本地文化格式。这是最糟糕的情况,没有通用解决方案。我建议将其简化为第2或第1种情况,具体取决于此任务是否更容易。

问题是,最终我将使用CurrentCulture或UI文化,而不是新建一个,所以我不确定这是否有帮助。 - sianabanana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接