1

我正在尝试创建一个简单的辅助函数来确定一个数字是否是真正的数字。显然它应该能够处理'null',负数,我试图在没有VB IsNumeric 帮助的情况下做到这一点。刚刚学习了 LINQ,我认为那将是完美的。

我想要的另一件事是能够传递字符串、整数、长整数或任何其他类型,所以我认为将“对象”作为参数是我真正想要的。当然,我总是可以在调用辅助方法之前将类型转换为字符串,但有可能吗?

这是我到目前为止的代码,我需要做的就是能够更改参数!我无法想象这是不可能的……有什么想法吗?

private static bool IsNumeric(string input)
{
if (input == null) throw new ArgumentNullException("input");
if (string.IsNullOrEmpty(input)) return false;

int periodCount = 0; //accept a string w/ 1dec to support values w/ a float

return input.Trim()
    .ToCharArray()
    .Where(c =>
    {
      if (c == '.') periodCount++;
      return Char.IsDigit(c) && periodCount <= 1;
    })
    .Count() == input.Trim().Length;
}
4

3 回答 3

4

也许?

private static bool IsNumeric<T>(T input)
{
    double d;
    return double.TryParse(input.ToString(), NumberStyles.Any,CultureInfo.InvariantCulture, out d);
}

bool b1 = IsNumeric(1); //<-- true
bool b2 = IsNumeric(1.0); //<-- true
bool b3 = IsNumeric("a"); //<-- false
bool b4 = IsNumeric("3E+10"); //<-- true
bool b5 = IsNumeric("1,234,567.0"); //<-- true
于 2013-05-04T21:36:25.900 回答
2

这里有几件事要看。首先,您的代码不适用于带有小数的任何内容。 return Char.IsDigit(c) && periodCount <= 1;应该return (Char.IsDigit(c) || c == '.') && periodCount <= 1;

其次,这是完全可能的。这使您的代码可以根据需要接受任何内容。

private static bool IsNumeric(object input)
{
    if (input == null) throw new ArgumentNullException("input");
    string inputStr = input.ToString();
    if (string.IsNullOrEmpty(inputStr)) return false;

    int periodCount = 0; //accept a string w/ 1dec to support values w/ a float

    return inputStr.Trim()
        .ToCharArray()
        .Where(c =>
        {
            if (c == '.') periodCount++;
            return (Char.IsDigit(c) || c == '.') && periodCount <= 1;
        })
        .Count() == inputStr.Trim().Length;
}

但是,它非常复杂。一个更简单的方法是

private static bool IsNumeric(object input)
{
    if (input == null) throw new ArgumentNullException("input");
    double test;
    return double.TryParse(input.ToString(), out test);
}
于 2013-05-04T21:37:16.477 回答
1

如果取决于您的数字必须有多大,请尝试以下选项:

return double.TryParse(input, out result);
return decimal.TryParse(input, out result); // Larger numbers than double, but slower.
return BigInteger.TryParse(input, out result); // Very large numbers, but slower and does not support decimals.
于 2013-05-04T23:17:08.343 回答