C#中缺少IsNumeric函数

Mic*_*ern 11 c# validation parsing

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

我过去使用过以下解决方案,但这不是最佳实践,因为我生成一个异常以确定该值是否为IsNumeric:

public bool IsNumeric(string input)
{
    try
    {
        int.Parse(input);
        return true;
    }
    catch
    {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Meh*_*ari 22

试试这个:

int temp;
return int.TryParse(input, out temp);
Run Code Online (Sandbox Code Playgroud)

当然,行为将与Visual BasicIsNumeric不同.如果您想要这种行为,可以添加对"Microsoft.VisualBasic"程序集的引用并直接调用该Microsoft.VisualBasic.Information.IsNumeric函数.

  • 我会使用`decimal`或`double`,因为很多东西都是数字而不是整数. (3认同)
  • 如果它特定于int,我会将方法名称更改为IsInteger. (3认同)

Eri*_* J. 14

您可以使用扩展方法扩展String类型以包含IsInteger:

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


Chr*_*lor 8

您可以使用int.TryParse 而不是使用int.Parse来避免异常.

像这样的东西

public static bool IsNumeric(string input)
{
  int dummy;
  return int.TryParse(input, out dummy);
}
Run Code Online (Sandbox Code Playgroud)

更一般地说,你可能想看看double.TryParse.

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


Nic*_*ver 5

我之前使用过以下扩展方法,如果它有帮助的话:

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

然后你可以使用.HasValuebool你现在或.Value为价值,但转换只有一次...只是把它扔在那里,不知道你使用它以后的情况.