2013-05-04 68 views
1

我试图创建一个确定的数是真正的数字简单的辅助函数。很明显,它应该能够处理'空',负数,我试图做到这一点没有VB的IsNumeric的帮助。刚学过LINQ,我认为那会很完美。则IsNumeric helper方法对大量

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

这里是我到目前为止的代码和所有我需要做的是能够改变的参数!我无法想象这是不可能的......任何想法?

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; 
} 
+1

为什么不直接用正则表达式测试(未经测试,从内存中): '@ “[ - +] [0-9] +?(\ [0-9] *)?”' – 2013-05-04 21:36:14

+1

或者使用decimal.TryParse或float.TryParse或double.TryParse? – 2013-05-04 21:37:18

+0

“大”号码是什么意思? “大”有多大? – 2013-05-04 23:14:31

回答

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); 
} 
+0

谢谢!我工作的公司总是会去LINQ,即使它让代码看起来像是用brainf * ck编写的!但我同意,第二个更可读。你知道你的实现(与对象)和上面使用'IsNumeric(T input)'的实现有何区别吗? – Justin 2013-05-06 15:49:42

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 
+0

我会给它一个镜头,看起来像我正在寻找的。我不认为你可以使用“T”作为实际的数据类型 - 我必须研究它。谢谢! – Justin 2013-05-06 15:16:03

+0

优秀!谢谢。 Bill – BillW 2013-08-13 04:54:58

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.