8

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

我试图将一个字符串(带有千位分隔符)解析为一个双精度字符串,并发现了以下问题。

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,是因为科学记数法以前给我带来了一些问题。

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

编辑:

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

4

3 回答 3

4

它按预期在我的机器上工作,所以我相信它与当前文化有关。尝试CultureInfo.InvariantCulturenull你的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); 
于 2012-09-06T12:42:02.243 回答
4

经过大量挖掘后更新(正确)答案

你说你现在的文化是en-ZA,但是检查

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

我们看到该值是空字符串,而不是","问题所述。因此,如果我们设置CultureInfo.CurrentCulture为,new CultureInfo("en-ZA")那么即使对于try1.

手动设置为","with后

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必须适当)!

于 2012-09-06T13:03:37.790 回答
1

文档 说,当对话失败时,返回 0.0 。

TryParse 最有可能返回 false,您应该尝试调用 Parse,以获取可能告诉您问题所在的异常消息。

于 2012-09-06T12:38:51.060 回答