C# 中 VB 的 IsNumeric() 等效项






4.23/5 (23投票s)
C# 中 VB 的 IsNumeric() 函数的替代项
引言
与 VB 2005 不同,C# 似乎缺少一个用于检查 string
是否包含可以被评估为数字的值的函数。 本文将演示一些 C# 替代 VB 的 IsNumeric() 函数的方法。
Int32.Parse()
首先是 Int32.Parse() 方法。它非常简单,您向它传递一个 string
参数,它会尝试将其解析为整数。 如果 string
无法转换为 int
,则该方法将失败并抛出异常
try
{
int result = int.Parse("123");
Debug.WriteLine("Valid integer: " + result);
}
catch
{
Debug.WriteLine("Not a valid integer");
}
在这里,我们使用 int
数据类型,它只是 C# 中 Int32 的同义词。 这是一个 32 位整数,因此它将成功解析介于 –2147483648 和 2147483647(含)之间的任何整数。 Parse()
方法也适用于其他 整数类型、浮点类型 和 十进制类型。
Int32.TryParse()
Int32.TryParse() 方法是 Int32.Parse() 的 .NET 2.0 改进版。 它更简洁,并且在解析失败时不会抛出异常。 它的工作原理如下
int result;
if (int.TryParse("123", out result))
{
Debug.WriteLine("Valid integer: " + result);
}
else
{
Debug.WriteLine("Not a valid integer");
}
Convert.ToInt32()
Convert.ToInt32() 方法与 Int32.Parse() 非常相似,如果 string
参数不是有效的 Int32
值,它将抛出异常。 唯一的区别是 Convert.ToInt32() 将接受 null
参数并将其评估为零,而 Int32.Parse() 将抛出 ArgumentNullException,即
// throws ArgumentNullExceptionint
result1 = Int32.Parse(null);
// doesn't throw an exception, returns 0
int result2 = Convert.ToInt32(null);
IsNumeric()
没错,您可以直接从 C# 调用 VB 的 IsNumeric() 函数。 首先添加对 Visual Basic 兼容性程序集的引用,即 Microsoft.VisualBasic.dll,其中包含该函数的实现

现在,您可以访问 Microsoft.VisualBasic.Information 类中的任何方法,包括 IsNumeric(),如下所示
using Microsoft.VisualBasic;
// ......
bool result = Information.IsNumeric("123");
这实际上不是一个推荐的方法,因为这些类被包含在 .NET 中以提供与旧版 VB 代码的向后兼容性。
模式匹配
使用 正则表达式 进行模式匹配是一个非常灵活的解决方案,如果您需要测试可能太大而无法容纳在变量中的非常大的数字,则特别有用。
string strToTest = "123";
Regex reNum = new Regex(@"^\d+$");
bool isNumeric = reNum.Match(strToTest).Success;
对于任何非负整数,此模式将评估为 true
。 您可以调整正则表达式以包含您想要的任何数字格式,例如负数、小数,甚至是 复数。
Char.IsNumber() 和 Char.IsDigit()
最后,我将提到 char
类的两种方法,Char.IsNumber() 和 Char.IsDigit()。 它们可用于检查单个字符是否为数字,例如
bool isNumeric = Char.IsNumber('5'); // true
这两种方法之间的区别非常微妙,因此请仔细阅读文档以确保您使用正确的一个。
摘要
借用 Perl 的一句话,有多种方法可以做到 (TIMTOWTDI)。 将这些技术中的任何一种封装在一个方法中,您就拥有了您自己的 C# IsNumeric()
函数。
快速警告
最后一个警告,小心这样的代码
string str = "\x1811\x1812\x1813";
Regex reNum = new Regex(@"^\d+$");
if (reNum.Match(str).Success) // evaluates to true
{
int i = int.Parse(str); // throws FormatException
}
您的正则表达式 \d
数字字符将匹配任何 Unicode 数字,即使它(如此处所示)是蒙古数字。 Int32.Parse()
方法不太实用,并且会抛出 FormatException。
历史
- 2006 年 11 月 10 日:初始帖子