2

今天正在使用 IsNumeric 进行一些基准测试,并将其与以下函数进行比较:

Private Function IsNumeric(ByVal str As String) As Boolean
    If String.IsNullOrEmpty(Str) Then Return False
    Dim c As Char

    For i As Integer = 0 To Str.Length - 1
        c = Str(i)
        If Not Char.IsNumber(c) Then Return False
    Next

    Return True
End Function

我对结果感到非常惊讶。使用数值时,它比常规 IsNumeric() 快 8-10 倍,使用空值或非数值时,它快 1000-1500 倍。

什么是 IsNumeric 这么长时间?在用上面的函数替换它之前,我还应该考虑其他事情吗?我在我的网站上大约 50 个不同的地方使用 IsNumeric,主要用于验证表单和查询字符串。

4

4 回答 4

16

您在哪里检查特定于语言环境的分隔符和小数位?否定?指数符号?

你看,你的函数只是数字字符串的一小部分。

1,000,000.00
1,5E59
-123456789

你错过了所有这些。

于 2009-02-16T18:20:12.690 回答
0

单个 char 只能包含 0、1、2、3、4、5、6、7、8、9

但完整的字符串可能包含以下任何内容:

1
1234
12.34
-1234
-12.34
0001

所以 IsNumeric 应该会慢一些。

还有文化和国际化问题。即,如果您正在处理 Unicode 字符串,IsNumeric 是否也处理来自所有其他语言的数字?

于 2009-02-16T18:21:26.260 回答
0

一般来说,我会避免重复或替换这样的语言功能,尤其是在像 VB 这样的语言中,它必然会为您实现许多用例。至少,我会将您的方法命名为不同的名称,以免其他开发人员感到困惑。

速度差异必然是因为您的代码所做的工作远远少于 VB 语言功能。

于 2009-02-16T18:35:32.450 回答
0

我会用

整数.TryParse()
或者
Double.TryParse()
取决于您使用的数据类型,因为这两者都考虑了地区差异。

于 2009-02-17T20:46:49.007 回答