65.9K
CodeProject 正在变化。 阅读更多。
Home

C# 中 VB 的 IsNumeric() 等效项

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.23/5 (23投票s)

2006年11月10日

CPOL

3分钟阅读

viewsIcon

312228

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,其中包含该函数的实现

Add VB Reference

现在,您可以访问 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 日:初始帖子
C# 等效于 VB 的 IsNumeric() - CodeProject - 代码之家
© . All rights reserved.