Поведение VB6 "IsNumeric()" в Windows 8/Windows 2012

При использовании приложения VB6 в Windows 7 обе строки возвращают TRUE, потому что десятичный разделитель почему-то не учитывается:

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

В Windows 8 или Windows 2012 один и тот же код возвращает TRUE или FALSE в зависимости от региональных настроек. Учитывая запятую как десятичный разделитель, определенный в региональных настройках, тогда:

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

Есть ли способ восстановить "старое" поведение без перекомпиляции приложения?

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() функция выше.

Другие вопросы по тегам