Bloodied
Bloodied

Reputation: 975

How do i check if input is any integer?

Simply asked, I need to check if a variable is numerical. I'm aware of the ability of:

set /a variable1=%variable%

setting non numerical strings to 0, but i need to be able to have 0 as an intiger as well as negative numbers.

This will be run very often, so a fast script is preferred. I've tried to echo the variable into a .txt, and use a for loop to scan through and return an error if anything other than 0-9 is detected, but the script is excessively long running, and frankly is a mess.

Upvotes: 1

Views: 1506

Answers (3)

Alim Özdemir
Alim Özdemir

Reputation: 2624

As mentioned in question17584282

The easiest for digits should be:

IF %1 NEQ +%1 echo Notnumeric!

If negative numbers (hyphen) are also to be considered, this will work

SET number=%1
if %1 EQU +%1 echo positive number
if %1==-%number:-=% echo negative number

Learned from https://www.itprotoday.com/compute-engines/jsi-tip-9692-how-can-batch-script-determine-if-variable-or-parameter-integer

Upvotes: 3

npocmaka
npocmaka

Reputation: 57252

@echo off 

:isInterer  input [returnVar] 
setlocal enableDelayedexpansion 
set "input=%~1" 

if "!input:~0,1!" equ "-" (
    set "input=!input:~1!"
) else (
    if "!input:~0,1!" equ "+" set "input=!input:~1!"
)

for %%# in (1 2 3 4 5 6 7 8 9 0) do ( 
        if not "!input!" == "" ( 
                set "input=!input:%%#=!" 
    )         
) 

if "!input!" equ "" ( 
        set result=true 
) else ( 
        set result=false 
) 

endlocal & if "%~2" neq "" (set %~2=%result%) else echo %result% 

try this.Some special symbols like ! and ^ could cause trouble though. You can also use findstr:

@echo off 

:isIntererFindstr  input [returnVar] 
setlocal enableDelayedexpansion 
set "input=%~1" 

if "!input:~0,1!" equ "-" (
    set "input=!input:~1!"
) else (
    if "!input:~0,1!" equ "+" set "input=!input:~1!"
)

echo !input!|findstr /r "[^0-9]" >nul 2>&1

if %errorlevel% equ 0 ( 
        set result=false 
) else ( 
        set result=true 
)
endlocal & if "%~2" neq "" (set %~2=%result%) else echo %result% 

Upvotes: 0

Squashman
Squashman

Reputation: 14290

You could do something to this affect. Remove all numbers. If anything is left over it is not an integer. Not saying this is perfect but it is a step in the right direction.

set "tempvar="
FOR /F "tokens=* delims=-0123456789" %%G IN ("%variable1%") DO SET "tempvar=%%G"

IF DEFINED tempvar echo NOT AN INTEGER

Upvotes: 2

Related Questions