C#中缺少IsNumeric函数

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

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

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

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

试试这个:

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

当然,行为将与Visual Basic IsNumeric不同。 如果您需要该行为,可以添加对“Microsoft.VisualBasic”程序集的引用,并直接调用Microsoft.VisualBasic.Information.IsNumeric函数 。

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

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

您可以使用int.TryParse而不是使用int.Parse来避免exception。

像这样的东西

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

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

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

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

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

然后你可以使用.HasValue作为你现在拥有的bool ,或.Value作为值,但只转换一次……只是将它扔出去,不知道你之后使用它的情况。

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

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

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

给出的其他方法是优越的,但为了完整起见,想要添加它。

Lot的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; } 

看看以下答案: 什么是NaN或IsNumeric的C#等价物?

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

另一种选择 – LINQ!

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

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

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

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

另请注意,此函数使用double.TryParse而不是int.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(); 
 public bool IsNumeric(string input) { int result; return Int32.TryParse(input,out result); } 

试试这个:

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

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

  1. 右键单击项目并选择“添加引用”,添加对Visual Basic库的引用:

在此处输入图像描述

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

希望,这有帮助,祝你好运!