Double.TryParse千位分隔符返回意外结果

时间:2012-09-06 12:31:09

标签: c# .net cultureinfo

我刚遇到一些非常奇怪的事情,只是想知道我是否遗漏了什么。

我试图将一个字符串(有千个分隔符)解析成一个double,并找到了下面的问题。

CultureInfo ci = CultureInfo.CurrentCulture; // en-ZA
string numberGroupSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator; //numberGroupSeparator = ,
string numberDecimalSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;//numberDecimalSeparator = .
string strValue = "242,445.24";
double try1;
double try2;
bool btry1 = Double.TryParse(strValue, out try1); //try1 = 242445.24 : btry1 = true
bool btry2 = Double.TryParse(strValue, NumberStyles.Any, null, out try2); //try2 = 0.0 : btry2 = false <- STRANGE
double try3 = Convert.ToDouble(strValue); //try3 = 242445.24

现在我之所以不想使用Convert.ToDouble是因为科学记谱法之前给了我一些问题。

有人知道为什么会这样吗?

修改

我已更新我当前的文化信息。

3 个答案:

答案 0 :(得分:4)

它按照预期在我的机器上工作,所以我认为它与当前文化有关。尝试在CultureInfo.InvariantCulture

中使用null代替TryParse
Double.TryParse(strValue, NumberStyles.Any,CultureInfo.InvariantCulture, out try2);

您当前指定的文化en-ZA失败,我尝试了以下代码,try2持有0.0

 Double.TryParse(strValue, NumberStyles.Any,new CultureInfo("en-ZA"), out try2); 

答案 1 :(得分:4)

经过多次挖掘后更新(正确)答案

您说您当前的文化是en-ZA,但检查

new System.Globalization.CultureInfo("en-ZA").NumberFormat.NumberGroupSeparator

我们看到该值是空字符串而不是问题所述的","。因此,如果我们将CultureInfo.CurrentCulture设置为new CultureInfo("en-ZA"),则即使try1解析也会失败。

使用

手动将其设置为","
Thread.CurrentThread.CurrentCulture.NumberFormat.NumberGroupSeparator = ",";

发现解析成try1成功。解析为try2仍然失败。

对于TryParse中使用的try2重载,文档非常清楚当格式提供程序为null时使用当前线程文化,因此必须继续其他内容。

在仔细比较InvariantCulture.NumberFormat与en-ZA文化之后,我注意到文化的货币格式也不同。试图

Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyGroupSeparator = ",";
Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator = ".";
赢得大奖:解析成功!所以真正发生的是在使用NumberStyles.All时,解析将数字视为货币

如果您尝试

,可以验证该假设
double.TryParse(strValue,
                NumberStyles.Any & ~NumberStyles.AllowCurrencySymbol, null, out try2);

成功而不需要弄乱货币分隔符(当然NumberGroupSeparator确实必须合适)!

答案 2 :(得分:1)

documentation表示会话失败时会返回0.0。

最有可能TryParse返回false,你应该尝试调用Parse,以获得可能告诉你错误的异常消息。