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