我试图解决一个相当普遍的问题 - 验证输入是一个更大的正整数1.只要输入不是科学记数法,我到目前为止所做的工作。
我在SO上搜索了很长时间以寻求解决方案,但是没有找到任何针对此特定案例的内容。所以这是我目前的代码:
If IsNumeric(objArgs(1)) Then
If CLng(objArgs(1)) = objArgs(1) Then
if(objArgs(1) < 1) then
wscript.echo "2nd parameter must be greater than 1"
else
' move on
end if
else
wscript.echo "2nd parameter is not an integer"
end if
else
wscript.echo "2nd parameter is not numeric"
end if
当输入类似于a
,0
,-10
,3.14
等等时,此功能正常。
当我输入科学记数法中的(大)数字时出现问题,例如1E+48
。如果我输入此内容,我会在CLng()
- 函数上出现溢出错误。
我该如何避免这种情况?
答案 0 :(得分:1)
将输入验证为大于1的正整数
像这样的验证任务是正则表达式的域。
Function IsPositiveInteger(input)
Dim re : Set re = New RegExp
re.pattern = "^\s*0*[1-9]\d*\s*$"
IsPositiveInteger = re.test(input)
End Function
用法:
MsgBox IsPositiveInteger("asdf") ' False
MsgBox IsPositiveInteger("0000") ' False
MsgBox IsPositiveInteger("0001") ' True
MsgBox IsPositiveInteger("9999") ' True
Expession
^ # start of string
\s* # allow any number of leading spaces
0* # allow any number of leading zeros
[1-9] # require one digit between 1 and 9
\d* # allow any number of following digits
\s* # allow any number of trailing spaces
$ # end of string
这将识别任何符合正整数的字符串。它不允许您查看字符串表示的整数是否适合VBScript的一种数字数据类型。
如果您的脚本需要进行此类转换,则必须自行应用范围检查。这可以通过词典字符串比较轻松完成。
要获得更严格的结果,请删除允许前导/尾随空格的表达式部分。
答案 1 :(得分:0)
CLng将转换为long,最大值为2 ^ 31-1。 如果你想测试真正的大数和/或分数, 使用CDbl(转换成双打)。
或者你真的想引用非标准的真正大但仍然整数的类吗? (即整数> 2 ^ 31-1)。