2014-02-14 94 views
2

我需要验证双精度值。当我TryParse .00 or ,00返回false,但我允许这个值必须为true。TryParse双精度值

此代码不是这种情况下正常工作

模型= 00或0.002,或789或0.12 ...

double number; 
double.TryParse(model, NumberStyles.Any, NumberFormatInfo.InvariantInfo, out number) 
+0

为什么不阅读[documentation](http://msdn.microsoft.com/en-us/library/3s27fasw%28v=vs.110%29.aspx)? – Andreas

+0

运行这个'“.00”'成功解析为'0','“,00”'返回false。 – asawyer

+0

我需要“,00”返回true也 – zrabzdn

回答

3

你可以循环所有支持文化:

bool parsable = false; 
double number = 0; 
var supportedCultures = new[] { CultureInfo.InvariantCulture, CultureInfo.CreateSpecificCulture("de-DE") }; 
foreach(var culture in supportedCultures) 
{ 
    parsable = double.TryParse(model, NumberStyles.Any, culture, out number); 
    if (parsable) 
     break; 
} 

或LINQ:

CultureInfo thisCulture = supportedCultures 
    .FirstOrDefault(c => double.TryParse(model, NumberStyles.Any, c, out number)); 
if (thisCulture != null) 
{ 
    Console.WriteLine("Number was parsable to " + number); 
} 

老办法,太容易出错asawyer指出("1,000,000.00"):

你可以用点代替逗号:

bool parsable = double.TryParse(model.Replace(",", "."), NumberStyles.Any, NumberFormatInfo.InvariantInfo, out number); 

+1

“1,000,000.00”'如何解析此更改? – asawyer

+0

字符串替换是一种肮脏且可能破解的黑客行为。通过你想要支持的文化循环是正确的方法,因为事实上,解析'.00'和',00'都意味着什么。 – Yuck

+0

@asawyer:我已经“删除”了这种方法,因为它非常容易出错。 –

0

当您使用NumberFormatInfo.InvariantInfo您强制解析器将.作为小数分隔符,将,作为千位分隔符。所以

double.TryParse(".002", out number) 

将返回true,但

double.TryParse(",789", out number) 

不会。

如果你想支持多种格式,你必须为每种格式调用TryParse。没有办法尝试和解析一个格式有效的数字,因为它们可能会返回不同的值。根据您使用的文化不同,"123,456"可能被解释为两种不同的方式。

0

我不认为你可以真正安全地做到这一点。如果您设法让系统处理将"."","定义为小数点分隔符和分组分隔符的两种方法,那么您会遇到模糊不清的问题。

例如,如果"1.001"被传入?那么"1,001"?你怎么知道一个是真的意味着“千分之一”还是“千分之一”?