SET "var="&for /f "delims=0123456789" %%i in ("%1") do set var=%%i
if defined var (echo %1 NOT numeric) else (echo %1 numeric)
根据需要将%1
替换为%yourvarname%
"var=%%i"
用双引号括起来也可以保护一些有害字符。 - foxidrive%yourvarname%
赋一个数字值,就会出现“var
未定义”的错误。有什么想法吗? - nst1nctz%1
是批处理过程的第一个参数,因此 call :chknumeric %varname%
会用 varname
的值替换 %1
。在活动行前加上标签 :chknumeric
,在下一行放置 goto :eof
,你就有了一个返回 var
的过程。此例程针对数字字符串,并将处理例如条形码号码之类的内容。如果需要,可以将 var
改为 notnumeric
,但 var
可以与 "." 进行比较,以测试单个小数点。或者与不同字符集进行比较,逻辑名称也会改变。 - Magoo对于 ±整数
(测试还要包括前导零):
echo(%~1|findstr "^[-][1-9][0-9]*$ ^[1-9][0-9]*$ ^0$">nul&&echo numeric||echo not numeric
echo("%~1"|findstr "^[\"][-][1-9][0-9]*[\"]$ ^[\"][1-9][0-9]*[\"]$ ^[\"]0[\"]$">nul&&echo numeric||echo not numeric
。 - Chaoix最简单的正整数应该是:
IF 1%1 NEQ +1%1 echo Notnumeric!
SET number=%1
if 1%1 EQU +1%1 echo positive number
if %1==-%number:-=% echo negative number
从这篇文章中了解到:
该文章是关于批处理脚本如何确定变量或参数是否为整数的。020
)和十六进制(0x10
)。正零(+0
)。重复否定(CMD将--5
视为5)。这可能对某人的需求不重要,但值得一提。总体而言,它运行得相当不错,适用于少量代码。 - Ben Scotttest.bat 2 bar
中时,%1
是数字,%2
不是数字,而 %3
是数字。 - Skull Kidvar
,而%var%
等于500
。set /a varCheck=%var%
if %varCheck% == %var% (goto :confirmed) else (exit /B)
exit /B
:confirmed
:: You can use %var% here, and it should only be executed if it is numerical!
%var%
等于例如a3453d
,它将设置varCheck
为0
,因为0
不等于a3453d
,所以它会退出批处理。@hornzach - 您的回答非常接近,并且比其他人的回答更简单。
要隐藏错误消息,在(至少在win 7中),请将标准错误输出(2)重定向到nul(一个特殊文件,静默丢弃输出“位桶”)
set /a varCheck = %var% 2>nul
那么你的答案对于这四个测试用例都有效。
完整答案及测试用例:
call :CheckNumeric AA "#NOT A VALID NUMBER"
call :CheckNumeric A1 "#NOT A VALID NUMBER"
call :CheckNumeric 1A "#NOT A VALID NUMBER"
call :CheckNumeric 11 "#A VALID NUMBER"
call :CheckNumeric 1.23456789012345678901234567890.123456 "#NOT A VALID NUMBER"
goto :EOF
:CheckNumeric
@ECHO.
@ECHO Test %1
set /a num=%1 2>nul
if {%num%}=={%1} (
@ECHO %1 #A VALID NUMBER, Expected %2
goto :EOF
)
:INVALID
@ECHO %1 #NOT A VALID NUMBER, Expected %2
输出:
Test AA
AA #NOT A VALID NUMBER, Expected "#NOT A VALID NUMBER"
Test A1
A1 #NOT A VALID NUMBER, Expected "#NOT A VALID NUMBER"
Test 1A
1A #NOT A VALID NUMBER, Expected "#NOT A VALID NUMBER"
Test 11
11 #A VALID NUMBER, Expected "#A VALID NUMBER"
Test 1.23456789012345678901234567890.123456
1.23456789012345678901234567890.123456 #NOT A VALID NUMBER, Expected "#NOT A VALID NUMBER"
base
的值为0(自动基数)。因此,我的两个示例的字符串比较为{5}=={05}
(去掉前导零)和{}=={009}
。变量num
对于009
仍未定义(或在已经定义的情况下保持其当前值),因为009
是一个无效的八进制数。 - MofiSET /A
导致 CMD.EXE 评估算术表达式的事实。它在这样的表达式中评估原始变量 %var%
,并将结果存储在第二个变量 %varCheck%
中,然后比较这两个变量。如果它们不同,CMD 将其评估为不同的值,这通常意味着原始值是非数字的。例如,如果您要求 CMD 返回字符串 "example"
的数值,CMD 将返回 0
(零)。由于 "example"
和 0
不是相同的值,我们可以假设给出了一个非数字值。 - Ben Scott与上面的代码执行相同的操作。但是,存在特殊字符的问题。然而,解决方案采用了不同的方法。
@echo off
cls
setlocal enabledelayedexpansion
if "%1"=="" (goto:eof) else (set _VAR2CHECK=%1)
for /l %%a in (0,1,9) do (
if defined _VAR2CHECK (set "_VAR2CHECK=!_VAR2CHECK:%%a=!") else (goto :end)
)
:end
if defined _VAR2CHECK (echo %1 #NOT A VALID NUMBER) else (echo %1 #A VALID NUMBER)
set "_VAR2CHECK="
endlocal
Test scenarions:
C:\>ISNUM 1A
1A #NOT A VALID NUMBER
C:\>ISNUM 11
11 #A VALID NUMBER
尝试以1进行除法。 但是对于不属于Z(非相对整数或小数)的数字无法工作。
set var=29
set /a number=%var% >nul 2>&1
set /a number=%number% / 1 >nul 2>&1
if "%var%" == "%number%" (echo numeric) else (echo NOT numeric)
if errorlevel
只接受可用于检查的数值:
set test_var=001
(
(if errorlevel %test_var% break ) 2>nul
)&&(
echo %test_var% is numeric
)||(
echo %test_var% is NOT numeric
)
set test_var=001X
(
(if errorlevel %test_var% break ) 2>nul
)&&(
echo %test_var% is numeric
)||(
echo %test_var% is NOT numeric
)
第一个检查会通过,第二个不会。
虽然上面的脚本不会处理一元+
- 如果您也想处理这种情况,请检查 isInteger.bat。
我使用这个函数代替,似乎对我而言没有任何问题...
REM == Script variables =============================================
SET "NUMCODE=%1"
SET "NAME=%2"
REM == Main script ==================================================
CALL :Validate "NUMCODE"
IF ERRORLEVEL 1 EXIT /B %ERRORLEVEL%
CALL :Validate "NAME"
IF ERRORLEVEL 1 EXIT /B %ERRORLEVEL%
ECHO Validation Complete and all variables passed validation.
REM == Functions ====================================================
:IsNumeric [string-value] [return-val]
SET "stringVal=%~1"
SET /A numericVal=%stringVal% > nul 2> nul
IF "%stringVal%"=="%numericVal%" (SET "%~2=1") ELSE (SET "%~2=0")
EXIT /B 0
:Validate
SET PASSEDVALIDATION=0
ECHO Validating %~1...
IF "%~1"=="NUMCODE" (
ECHO - Value: %NUMCODE%
IF NOT "%NUMCODE%"=="" SET PASSEDVALIDATION=1
IF "!PASSEDVALIDATION!"=="1" (
CALL :IsNumeric %NUMCODE% RETVAL
SET PASSEDVALIDATION=!RETVAL!
)
IF "!PASSEDVALIDATION!"=="1" (
IF NOT %NUMCODE% GEQ 1 SET PASSEDVALIDATION=0
)
IF "!PASSEDVALIDATION!"=="1" (
IF NOT %NUMCODE% LEQ 526 SET PASSEDVALIDATION=0
)
IF "!PASSEDVALIDATION!"=="0" (
ECHO - The first parameter is invalid, it can not be blank.
ECHO - Valid value is a number from 1 to 526.
ECHO - Leading zeros are not valid.
)
)
IF "%~1"=="NAME" (
ECHO - Value: %NAME%
IF NOT "%NAME%"=="" SET PASSEDVALIDATION=1
IF "!PASSEDVALIDATION!"=="0" (
ECHO - The second parameter is invalid, it can not be blank.
)
)
IF "!PASSEDVALIDATION!"=="0" (
ECHO - Failed validation.
EXIT /B 1
) ELSE (
ECHO - Passed validation.
)
EXIT /B 0
C:\mytestscript.bat 10 MrTest
Validating NUMCODE...
- Value: 10
- Passed validation.
Validating NAME...
- Value: MrTest
- Passed validation.
C:\mytestscript.bat 600
Validating NUMCODE...
- Value: 600
- The first parameter is invalid, it can not be blank.
- Valid value is a number from 1 to 526.
- Leading zeros are not valid.
- Failed validation.
C:\mytestscript.bat 10
Validating NUMCODE...
- Value: 10
- Passed validation.
Validating NAME...
- Value:
- The second parameter is invalid, it can not be blank.
- Failed validation.
我使用一种更低技术的方法。它仅适用于整数并支持负值。
set "XVALUE=%~1"
set /A XVALUE=XVALUE
if "%XVALUE%" NEQ "%~1" goto :invalid_value
第一行获取命令行参数并将其放入XVALUE中。使用“引号”可以避免各种特殊字符的问题。
第二行看起来很神秘,但利用了SET /A等号右侧有文本字符串时被解释为包含数字值的环境变量的特性。命令处理器解析假定的数字值而不生成任何错误消息或设置ERRORLEVEL。以这种方式执行始终会将XVALUE转换为有效的数字值,无论传递给我们的是什么。
第三行是可选的,只有在您想要严格限制参数为-2147483648到2147483647范围内的数字值时才需要使用if
测试。