Windows 8 VB6“;IsNumeric();Windows 8/Windows 2012中的行为
在Windows 7上使用VB6应用程序时,这两行都返回TRUE,因为不知何故没有考虑小数分隔符: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 有没有办法在不重新编译应用程序的情况
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()
将句点视为小数而不考虑区域设置,就像上面的myIsNumber()
函数一样。在区域设置中,您可以将Numbers
tab中的十进制符号设置为“.”,将Currency
tab中的十进制符号设置为“.”,以便将两个字符串都视为数字。顺便说一句,这与你最初的研究暗示的操作系统版本无关。@wqw:我的测试证实操作系统在某种程度上是相关的。在OSs(Windows 7和Windows 2012 Server)中,十进制分隔符都是“,”表示数字和货币。我使用的是保加利亚语言环境,两个十进制符号都是“,”,而在Win7 x64IsNumeric(“123.45”)=False
——刚刚测试过。您是否在区域设置中检查了数字分组符号?用于对数字进行分组,例如,1000
是用数字分组符号“,”
写入的1000。如果您的数字分组符号为“”、“
且十进制分隔符为“”
,则“123.45”
为有效数字123.45
。另外“123,45”
是一个有效的数字12345
。谢谢,但我正在寻找一个不需要重新编译程序的解决方案。