【问题标题】:IsNumeric returns true for strings containing a D characterIsNumeric 对包含 D 字符的字符串返回 true
【发布时间】:2011-11-25 09:28:58
【问题描述】:

今天早上我在一个 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 的已知问题吗?

【问题讨论】:

    标签: vb.net vb6 numeric


    【解决方案1】:

    如果您查看 VB6 文档:

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

    【讨论】:

    • 哦,好吧 - 我假设这已经在 VB.NET 中被更改/放弃了?
    • 看起来只是又失去了保真度,是的。
    【解决方案2】:

    正是因为这种情况,我一直在使用自己的 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”附加到它时,它会变成数字,因此您需要添加一个检查,就像我在我的代码中所做的那样。

    【讨论】:

    • IsNumeric(null & "e0") 会返回 false 那么为什么要检查空字符串呢?
    • 你是对的。但是,如果您修改此代码以使用 IsNumeric("" & ".0e0") 检查整数,它将返回 true。
    • IsNumeric("$34.20") 不适用于美国英语区域设置。
    【解决方案3】:

    我建议制作一个自定义验证器。您只想允许 0-9 吗?负数呢?逗号?我从不关心微软的实现,但我理解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多