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)
Windows XP/Windows 7/Windows 8/Windows 10系统封装的另类教程和思路
如何在 Windows Phone 8.1 / Windows 10 上创建自定义 VirtualizingPanel?