TryParse双精度值
问题描述:
我需要验证双精度值。当我TryParse .00 or ,00
返回false
,但我允许这个值必须为true。TryParse双精度值
此代码不是这种情况下正常工作
模型= 00或0.002,或789或0.12 ...
double number;
double.TryParse(model, NumberStyles.Any, NumberFormatInfo.InvariantInfo, out number)
答
你可以循环所有支持文化:
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);
答
当您使用NumberFormatInfo.InvariantInfo
您强制解析器将.
作为小数分隔符,将,
作为千位分隔符。所以
double.TryParse(".002", out number)
将返回true,但
double.TryParse(",789", out number)
不会。
如果你想支持多种格式,你必须为每种格式调用TryParse
。没有办法尝试和解析一个格式有效的数字,因为它们可能会返回不同的值。根据您使用的文化不同,"123,456"
可能被解释为两种不同的方式。
答
我不认为你可以真正安全地做到这一点。如果您设法让系统处理将"."
和","
定义为小数点分隔符和分组分隔符的两种方法,那么您会遇到模糊不清的问题。
例如,如果"1.001"
被传入?那么"1,001"
?你怎么知道一个是真的意味着“千分之一”还是“千分之一”?
为什么不阅读[documentation](http://msdn.microsoft.com/en-us/library/3s27fasw%28v=vs.110%29.aspx)? – Andreas
运行这个'“.00”'成功解析为'0','“,00”'返回false。 – asawyer
我需要“,00”返回true也 – zrabzdn