TryParse双值

时间:2014-02-14 14:44:16

标签: c# tryparse

我需要验证双值。当我TryParse .00 or ,00返回false时,我允许此值必须为真。

此代码无法正常使用

model =,00或.002或789或.12 ......

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

3 个答案:

答案 0 :(得分: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 :(得分:0)

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

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

会返回true,但是

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

不会。

如果您想支持多种格式,则必须为每种格式调用TryParse 。没有办法尝试解析在格式中有效的数字,因为它们可能返回不同的值。 "123,456"可以通过两种不同的方式解释,具体取决于您使用的文化。

答案 2 :(得分:0)

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

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