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

Windows 8 VB6“;IsNumeric();Windows 8/Windows 2012中的行为,windows-8,vb6,isnumeric,Windows 8,Vb6,Isnumeric,在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 有没有办法在不重新编译应用程序的情况

在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
有没有办法在不重新编译应用程序的情况下恢复“旧”行为?

这不是您使用的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()
将句点视为小数而不考虑区域设置,就像上面的my
IsNumber()
函数一样。

在区域设置中,您可以将
Numbers
tab中的十进制符号设置为“.”,将
Currency
tab中的十进制符号设置为“.”,以便将两个字符串都视为数字。顺便说一句,这与你最初的研究暗示的操作系统版本无关。@wqw:我的测试证实操作系统在某种程度上是相关的。在OSs(Windows 7和Windows 2012 Server)中,十进制分隔符都是“,”表示数字和货币。我使用的是保加利亚语言环境,两个十进制符号都是“,”,而在Win7 x64
IsNumeric(“123.45”)=False
——刚刚测试过。您是否在区域设置中检查了数字分组符号?用于对数字进行分组,例如,
1000
是用数字分组符号
“,”
写入的1000。如果您的数字分组符号为“
”、“
且十进制分隔符为“
,则
“123.45”
为有效数字
123.45
。另外
“123,45”
是一个有效的数字
12345
。谢谢,但我正在寻找一个不需要重新编译程序的解决方案。