我刚遇到一些非常奇怪的事情,只是想知道我是否遗漏了什么。
我试图将一个字符串(有千个分隔符)解析成一个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
是因为科学记谱法之前给了我一些问题。
有人知道为什么会这样吗?
修改
我已更新我当前的文化信息。
答案 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,以获得可能告诉你错误的异常消息。