对于包含D字符的字符串,IsNumeric返回true

Mat*_*lko 8 vb.net vb6 numeric

我今天早上在VB6应用程序中遇到了一个奇怪的错误,这都是因为IsNumeric没有像我预期的那样工作.有人可以解释为什么?对我来说,这似乎是一个错误.

此代码显示4.15877E+62在消息框中:

Dim strMessage As String
strMessage = "0415877D57"
If IsNumeric(strMessage) Then
    MsgBox CDbl(strMessage)
Else
    MsgBox "not numeric"
End If
Run Code Online (Sandbox Code Playgroud)

我猜测运行时引擎错误地认为D实际上是E?我认为这是一个错误,因为VB.NET输出中完全相同的代码not numeric 这是IsNumeric的已知问题吗?

Bob*_*b77 14

如果您查看VB6文档:

注意 浮点值可以表示为mmmEeee或mmmDeee,其中mmm是尾数,eee是指数(幂的值为10).单数据类型的最高正值是3.402823E + 38,或者是38次幂的3.4倍; Double数据类型的最高正值是1.79769313486232D + 308,或大约1.8倍10到308的幂.使用D在数字文字中分隔尾数和指数会导致该值被视为Double数据类型.同样,以相同的方式使用E将值视为单数据类型.


G M*_*ros 11

由于这种情况,我一直在使用我自己的IsNumber功能很长一段时间.对于某些货币符号,IsNumeric也可以返回true,如下所示:IsNumeric("$ 34.20").

我的IsNumber函数如下所示:

Public Function IsNumber(ByVal Data As String) As Boolean

  If Data = "" Then
    IsNumber = False
    Exit Function
  End If

  IsNumber = IsNumeric(Data & "e0")

End Function
Run Code Online (Sandbox Code Playgroud)

这里的想法是......如果数据中已经存在e或d,则添加另一个将导致数据不是使用IsNumeric检查的数字.您可以通过将"e0"替换为".0e0"来轻松更改此功能以仅允许整数.想要只是正整数?然后使用:IsNumeric(" - "&Data&".0e0")

这个方法的唯一缺点是空字符串通常不是数字,但是当你向它添加"e0"时,它变成数字,所以你需要添加一个检查,就像我在我的代码中所做的那样.