.NET测试字符串的数值

时间:2009-07-21 17:33:13

标签: c# regex algorithm

考虑在C#中需要一个函数来测试字符串是否是数值。

要求:

  • 必须返回布尔值。
  • 函数应该能够允许整数,小数和负数。
  • 假设没有using Microsoft.VisualBasic来调用IsNumeric()。这是一个重新发明轮子的案例,但运动很好。

目前的实施:

 //determine whether the input value is a number
    public static bool IsNumeric(string someValue)
    {
        Regex isNumber = new Regex(@"^\d+$");
        try
        {
            Match m = isNumber.Match(someValue);
            return m.Success;                           
        }
        catch (FormatException)
        {return false;}
    }

问题:如何改进,以便正则表达式匹配负数和小数?你做了哪些彻底的改进?

7 个答案:

答案 0 :(得分:19)

刚刚离开我的头脑 - 为什么不使用double.TryParse?我的意思是,除非你真的想要一个正则表达式解决方案 - 在这种情况下我不确定你真的需要它:)

答案 1 :(得分:10)

你能使用.TryParse吗?

int x;
double y;
string spork = "-3.14";

if (int.TryParse(spork, out x))
    Console.WriteLine("Yay it's an int (boy)!");
if (double.TryParse(spork, out y))
    Console.WriteLine("Yay it's an double (girl)!");

答案 2 :(得分:6)

Regex isNumber = new Regex(@"^[-+]?(\d*\.)?\d+$");

更新为允许在号码前面加上+或 - 。

编辑:您的try块没有执行任何操作,因为其中的任何方法都没有实际抛出FormatException。整个方法可以写成:

// Determine whether the input value is a number
public static bool IsNumeric(string someValue)
{
  return new Regex(@"^[-+]?(\d*\.)?\d+$").IsMatch(someValue);
}

答案 3 :(得分:1)

好吧,对于底片,你需要在开头包含一个可选的减号:

^-?\d+$

对于小数,您需要考虑小数点:

^-?\d*\.?\d*$

可能的指数表示法:

^-?\d*\.?\d*(e\d+)?$

答案 4 :(得分:0)

除非你真的想在另一个Q& A中使用正则表达式Noldorin posted a nice extension method

<强>更新

正如帕特里克正确指出的那样,该链接指向一个扩展方法,该方法检查对象是否是数字类型,而不是它是否代表数值。然后使用Saulius和yodaj007建议的double.TryParse可能是最好的选择,处理各种带有不同小数分隔符,千位分隔符等的怪癖。只需用一个很好的扩展方法将其包装起来:

public static bool IsNumeric(this string value)
{
    double temp;
    return double.TryParse(value.ToString(), out temp);
}

......然后开火:

string someValue = "89.9";
if (someValue.IsNumeric()) // will be true in the US, but not in Sweden
{
    // wow, it's a number!
]

答案 5 :(得分:0)

我不能说我会使用正则表达式来检查字符串是否是数值。这么简单的过程既缓慢又沉重。我只是一次遍历字符串一个字符,直到我进入无效状态:

public static bool IsNumeric(string value)
{
    bool isNumber = true;

    bool afterDecimal = false;
    for (int i=0; i<value.Length; i++)
    {
        char c = value[i];
        if (c == '-' && i == 0) continue;

        if (Char.IsDigit(c))
        {
            continue;
        }

        if (c == '.' && !afterDecimal)
        {
            afterDecimal = true;
            continue;
        }

        isNumber = false;
        break;
    }

    return isNumber;
}

上面的例子很简单,应该为大多数数字完成工作。然而,它并不具有文化敏感性,但它应该是足够的,以使其具有文化敏感性。

答案 6 :(得分:0)

另外,请确保生成的代码通过土耳其测试:
http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html