C#中缺少IsNumeric函数

时间:2010-05-26 22:16:18

标签: c# validation parsing

自从发布C#以来,困扰我的一件事就是缺少通用的IsNumeric函数。我知道,如果值是数字,很难生成一个一站式解决方案。

我过去使用过以下解决方案,但这不是最佳做法,因为我正在生成异常以确定该值是否为IsNumeric:

public bool IsNumeric(string input)
{
    try
    {
        int.Parse(input);
        return true;
    }
    catch
    {
        return false;
    }
}

这仍然是解决此问题的最佳方法,还是有更有效的方法来确定C#中的值是否为数字?

13 个答案:

答案 0 :(得分:22)

试试这个:

int temp;
return int.TryParse(input, out temp);

当然,行为会与Visual Basic IsNumeric不同。如果您想要这种行为,可以添加对“Microsoft.VisualBasic”程序集的引用并直接调用Microsoft.VisualBasic.Information.IsNumeric function

答案 1 :(得分:14)

您可以使用extension methods扩展String类型以包含IsInteger:

namespace ExtensionMethods
{
    public static class MyExtensions
    {
        public static bool IsInteger(this String input)
        {
             int temp;
             return int.TryParse(input, out temp);        
        }
    }   
}

答案 2 :(得分:8)

不是使用int.Parse,而是使用int.TryParse并避免异常。

像这样的东西

public static bool IsNumeric(string input)
{
  int dummy;
  return int.TryParse(input, out dummy);
}

更一般地说,您可能希望查看double.TryParse

您还应该考虑的一件事是为不同文化处理数字字符串的可能性。例如,希腊语(el-GR)使用,作为小数分隔符,而英国(en-GB)使用.。因此字符串“1,000”将为1000或1,具体取决于当前的文化。鉴于此,您可以考虑为IsNumeric提供支持传递预期文化,数字格式等的重载。看看double.TryParse的2次重载。

答案 3 :(得分:5)

我之前使用过以下extension method,如果它有帮助的话:

public static int? AsNumeric(this string source)
{
  int result;
  return Int32.TryParse(source, out result) ? result : (int?)null;
}

然后你可以.HasValue使用现在的bool,或者使用.Value作为值,但只转换一次......只是把它扔到那里,不知道是什么情况你以后用它。

答案 4 :(得分:4)

如果你使用Int32.TryParse,那么你不需要在TryCatch块中包含调用,但是否则,这是采取的方法。

答案 5 :(得分:3)

对于这种方法并不是很疯狂,但是您可以通过添加对Microsoft.VisualBasic.dll库的引用来从C#调用vb.net isNumeric函数...

bool x= Microsoft.VisualBasic.Information.IsNumeric("123");

给出的其他方法都很优秀,但为了完整起见,我想加上这个方法。

答案 6 :(得分:2)

很多TryParse的答案。使用Char.IsNumber():

,这有点不同
    public bool IsNumeric(string s)
    {
        for (int i = 0; i < s.Length; i++)
        {
            if (char.IsNumber(s, i) == false)
            {
                return false;
            }
        }
        return true;
    }

答案 7 :(得分:1)

看看以下答案: What is the C# equivalent of NaN or IsNumeric?

Double.TryParse负责所有数值,而不仅仅是整数。

答案 8 :(得分:1)

另一种选择 - LINQ!

public static class StringExtensions
{
  public static bool IsDigits(this String text)
  {
    return !text.Any(c => !char.IsDigit(c));
  }
}

请注意,这假设您只需要数字0-9。如果您想接受小数点,符号,指数等,请用IsDigit()重新IsNumber()

答案 9 :(得分:1)

我多年来一直使用以下小代码段作为纯C#IsNumeric函数。

当然,它与Microsoft.VisualBasic库的IsNumeric函数不完全相同(如果查看反编译代码)涉及大量类型检查和IConvertible接口的使用但是这个小功能对我来说效果很好。

另请注意,此函数使用double.TryParse而不是int.TryParse来允许解析整数(包括long)和浮点数。另请注意,此函数在解析(例如)浮点数时特别声明InvariantCulture,因此将正确识别123.00123,00(注意逗号和小数点分隔符)为浮动点数。

using System;
using System.Globalization;

namespace MyNumberFunctions
{
   public static class NumberFunctions
   {
      public static bool IsNumeric(this object expression)
      {
         if (expression == null)
         {
            return false;
         }
         double number;
         return Double.TryParse(Convert.ToString(expression, CultureInfo.InvariantCulture), NumberStyles.Any, NumberFormatInfo.InvariantInfo, out number);
      }
   }
}

用法非常简单,因为它是作为扩展方法实现的:

string myNumberToParse = "123.00";
bool isThisNumeric = myNumberToParse.IsNumeric();

答案 10 :(得分:0)

public bool IsNumeric(string input)
{
   int result;
   return Int32.TryParse(input,out result);
}

答案 11 :(得分:0)

试试这个:

public static bool IsNumeric(object o)
{
    const NumberStyles sty = NumberStyles.Any;
    double d;
    return (o != null && Double.TryParse(o.ToString(), sty, null, out d));
}

答案 12 :(得分:0)

您仍然可以在C#中使用Visual Basic功能。您唯一需要做的就是按照下面的说明操作:

  1. 添加对Visual Basic库的引用,方法是右键单击项目并选择&#34; Add Reference&#34;:
  2. enter image description here

    1. 然后在您的课程中导入,如下所示:

      使用Microsoft.VisualBasic;

    2. 接下来在任意位置使用,如下所示:

              if (!Information.IsNumeric(softwareVersion))
          {
              throw new DataException(string.Format("[{0}] is an invalid App Version!  Only numeric values are supported at this time.", softwareVersion));
          }
      
    3. 希望,这有助于祝你好运!