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

时间:2011-11-25 09:28:59

标签: 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

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

3 个答案:

答案 0 :(得分:14)

如果您查看VB6文档:

  

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

答案 1 :(得分: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

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

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

答案 2 :(得分:1)

我建议制作一个自定义验证器。你想只允许0-9吗?消极情况怎么样?逗号?我从不关心微软的实施,但我理解它。