Windows 8/Windows 2012 中的 VB6“IsNumeric()”行为

Posted

技术标签:

【中文标题】Windows 8/Windows 2012 中的 VB6“IsNumeric()”行为【英文标题】:VB6 "IsNumeric()" behaviour in Windows 8/Windows 2012 【发布时间】:2013-08-21 22:20:35 【问题描述】:

在 Windows 7 上使用 VB6 应用程序,两行都返回 TRUE,因为不考虑小数点分隔符:

IsNumeric("123.45")
IsNumeric("123,45")

在 Windows 8 或 Windows 2012 上,相同的代码会根据区域设置返回 TRUE 或 FALSE。考虑逗号作为区域设置中定义的小数分隔符,则:

IsNumeric("123.45") returns FALSE
IsNumeric("123,45") returns TRUE

有什么方法可以在不重新编译应用的情况下恢复“旧”行为?

【问题讨论】:

在区域设置中,您可以将Numbers选项卡中的十进制符号设置为“。”和Currency 选项卡中的小数符号到“,”,这两个字符串都被视为数字。顺便说一句,这与您最初的研究暗示的操作系统版本无关。 @wqw:我的测试证实操作系统在某种程度上是相关的。在两个操作系统(Windows 7 和 Windows 2012 Server)中,小数点分隔符都是“,”,表示数字和货币。 我使用的是保加利亚语语言环境,两个十进制符号都是“,”,并且在 Win7 x64 IsNumeric("123.45") = False 上——刚刚测试过。 您是否在区域设置中检查了数字分组符号?它用于对数字进行分组,例如1,000 是一千,用数字分组符号"," 书写。如果您的数字分组符号是"," 并且您的小数分隔符是".",那么"123.45" 是一个有效数字123.45"123,45" 也是一个有效数字 12345 【参考方案1】:

不是您使用的 Windows 版本的新问题。它始终基于机器的区域设置。

我为我的应用程序所做的是创建了自己的函数:

Public Function IsNumber(ByRef Expression As Variant) As Boolean
    Select Case VarType(Expression)
    Case vbInteger, vbLong, vbSingle, vbDouble, vbCurrency, vbDate, vbBoolean, vbDecimal, vbByte
        IsNumber = True
    Case vbString
        Dim Negative As Boolean
        Dim Number As Boolean
        Dim Period As Boolean
        Dim Positive As Boolean
        Dim X As Long
        For X = 1& To Len(Expression)
            Select Case Mid$(Expression, X, 1&)
            Case "0" To "9"
                Number = True
            Case "-"
                If Period Or Number Or Negative Or Positive Then Exit Function
                Negative = True
            Case "."
                If Period Or Exponent Then Exit Function
                Period = True
            Case "E", "e"
                If Not Number Then Exit Function
                If Exponent Then Exit Function
                Exponent = True
                Number = False
                Negative = False
                Period = False
            Case "+"
                If Not Exponent Then Exit Function
                If Number Or Negative Or Positive Then Exit Function
                Positive = True
            Case vbSpace, vbTab, vbVerticalTab, vbCr, vbLf, vbFormFeed
                If Period Or Number Or Exponent Or Negative Then Exit Function
            Case Else
                Exit Function
            End Select
        Next X
        IsNumber = Number
    End Select
End Function

如果您明确地处理字符串,那么您可以简化该函数。而且您可能不想处理指数,所以这可能更适合:

Public Function IsNumber(ByRef Expression As String) As Boolean
    Dim Negative As Boolean
    Dim Number As Boolean
    Dim Period As Boolean
    Dim X As Long
    For X = 1& To Len(Expression)
        Select Case Mid$(Expression, X, 1&)
        Case "0" To "9"
            Number = True
        Case "-"
            If Period Or Number Or Negative Then Exit Function
            Negative = True
        Case "."
            If Period Then Exit Function
            Period = True
        Case vbSpace, vbTab, vbVerticalTab, vbCr, vbLf, vbFormFeed
            If Period Or Number Or Negative Then Exit Function
        Case Else
            Exit Function
        End Select
    Next X
    IsNumber = Number
End Function

当您需要转换数字时,请使用Str() 而不是CLng()/CInt()/CDbl()/CSng()/Val()Str() 将句点视为小数,无论语言环境如何,就像我上面的 IsNumber() 函数一样。

【讨论】:

谢谢,但我正在寻找不需要重新编译程序的解决方案。

以上是关于Windows 8/Windows 2012 中的 VB6“IsNumeric()”行为的主要内容,如果未能解决你的问题,请参考以下文章

405 - 不允许用于访问此页面的 HTTP 动词。 [IIS 8.5] [Windows Server 2012 R2]

SignalR,有限的唯一连接(打开的选项卡)IIS 8,Windows 8

使用 Windows RT 的客户端证书(windows 8.1/windows phone 8.1)

mysql 8.0 windows一键安装脚本

Windows XP/Windows 7/Windows 8/Windows 10系统封装的另类教程和思路

如何在 Windows Phone 8.1 / Windows 10 上创建自定义 VirtualizingPanel?