dans un fichier de commandes Windows cmd (.bat), comment ajouter une valeur numérique de sorte qu'une valeur donnée comprise dans la plage 0..99 soit transformée en une chaîne de caractères comprise entre "00" et "99". C'est à dire. Je voudrais avoir des zéros non significatifs pour des valeurs inférieures à 10.
Vous pouvez utiliser un processus en deux étapes:
REM initial setup
SET X=5
REM pad with your desired width - 1 leading zeroes
SET PADDED=0%X%
REM slice off any zeroes you don't need -- BEWARE, this can truncate the value
REM the 2 at the end is the number of desired digits
SET PADDED=%PADDED:~-2%
TEMP
contient maintenant la valeur complétée. S'il existe un risque que la valeur initiale de X
ait plus de 2 chiffres, vous devez vérifier que vous ne l'avez pas tronqué par inadvertance:
REM did we truncate the value by mistake? if so, undo the damage
SET /A VERIFY=1%X% - 1%PADDED%
IF NOT "%VERIFY%"=="0" SET PADDED=%X%
REM finally update the value of X
SET X=%PADDED%
Note importante:
Cette solution crée ou écrase les variables PADDED
et VERIFY
. Tout script qui définit les valeurs de variables qui ne sont pas censées être conservées après sa fin doit être placé dans des instructions SETLOCAL
et ENDLOCAL
afin d'éviter que ces modifications ne soient visibles de l'extérieur.
Si vous êtes sûr que le nombre de chiffres de votre numéro d'origine est toujours <= 2, alors
set "x=0%x%"
set "x=%x:~-2%"
Si le nombre peut dépasser 2 chiffres et que vous souhaitez ajouter 2 chiffres sans tronquer les valeurs supérieures à 99, alors
setlocal enableDelayedExpansion
if "%x%" equ "%x:~-2%" (
set "x=0%x%"
set "x=!x:~-2!"
)
Ou sans expansion retardée, en utilisant une variable intermédiaire
set paddedX=0%x%
if "%x%" equ "%x:~-2%" set "x=%paddedX:~-2%"
La bonne chose à propos des algorithmes ci-dessus est qu'il est trivial d'étendre le remplissage à n'importe quelle largeur arbitraire. Par exemple, pour remplir jusqu’à la largeur 10, ajoutez simplement 9 zéros et ajoutez les 10 derniers caractères.
set "x=000000000%x%"
set "x=%x:~-10%"
Pour éviter de tronquer
set paddedX=000000000%x%
if "%x%" equ "%x:~-10%" set "x=%paddedX:~-10%"
La ligne unique
IF 1%Foo% LSS 100 SET Foo=0%Foo%
vous obtiendrez ce que vous voulez pour des nombres dans la plage que vous spécifiez. Les valeurs du sous-ensemble 0 à 9 ne changent pas si elles sont déjà à remplissage unique.
Les réponses précédentes avaient expliqué toutes les méthodes existantes pour remplir une valeur avec des zéros à gauche; Je veux juste ajouter un petit truc que je faisais plus facilement. Ce qui n’avait pas été suffisamment mentionné dans les réponses précédentes, c’est que dans la plupart des cas, la valeur qui sera complétée est incrémentée dans une boucle et que la valeur complétée est simplement utilisée pour l’afficher (ou des tâches similaires, comme rename). Par exemple, pour afficher les valeurs comprises entre 00 et 99:
set x=0
:loop
rem Pad x value, store it in padded
set padded=0%x%
set padded=%padded:~-2%
rem Show padded value
echo %padded%
set /A x+=1
if %x% leq 99 goto loop
Si tel est le cas, la valeur de la variable peut être utilisée à la fois pour contrôler la boucle et afficher sa valeur complétée sans modification si ses limites sont traduites correctement. Par exemple, pour afficher les valeurs comprises entre 00 et 99:
set x=100
:loop
rem Show padded value
echo %x:~-2%
set /A x+=1
if %x% leq 199 goto loop
Cette méthode fonctionne aussi avec n'importe quel nombre de zéros à gauche du pad.
Antonio
Cet exemple utilise une boucle for
pour démontrer, mais la logique est la même, même si vous l'utilisiez sans la boucle. Juste echo
un 0
devant si le nombre est inférieur à 10.
setlocal enabledelayedexpansion
for /l %%a in (1,1,40) do (
set n=%%a
if !n! lss 10 (
echo 0!n!
) else (
echo !n!
)
)
pause >nul
OK GUYS, j'ai trouvé une solution en la compressant le plus simplement possible.
@echo off
title pad numbers
set num=0
set zero= 000
:loop
@set /a num=%num%+1
if /i %num% GTR 9 set zero= 00
if /i %num% GTR 99 set zero= 0
if /i %num% GTR 999 set zero=
echo %zero%%num%
goto loop
cela affichera votre numéro de compte en utilisant 4 chiffres. mais le code peut être modifié pour utiliser 2 chiffres comme indiqué ci-dessous.
@echo off
title pad numbers
set num=0
set zero= 0
:loop
@set /a num=%num%+1
if /i %num% GTR 9 set zero=
echo %zero%%num%
goto loop
si vous voulez le définir comme une seule variable affichable ...
@echo off
title pad numbers
set num=0
set zero= 0
:loop
@set /a num=%num%+1
if /i %num% GTR 9 set zero=
set %zero%%num%=number
echo %number%
goto loop
si vous voulez que ça compte en quelques secondes ...
@echo off
title pad numbers
set num=0
set zero= 0
:loop
@set /a num=%num%+1
if /i %num% GTR 9 set zero=
set %zero%%num%=number
echo %number%
ping localhost -n 2 >nul
goto loop
j'espère que c'était une aide précieuse ^^
@echo off
rem .
rem counter example - with and without padding (up to 260 leading 0s which should be enough for most filenames)
rem .
rem we assume values given are valid
rem additional error checking could be done to make sure they are numbers
rem and to ensure that starting is less than ending
rem and that the number of ending digits is not greater than the number of padding digits
rem .
if "%2"=="" (
echo.
echo usage: %~nx0 [starting number] [ending number] [pad]
echo example: %~nx0 0 19 will output numbers 0 to 19 each on a new line
echo example: %~nx0 3 12 8 will output numbers 3 to 12 each on a new line padded to 8 digits
echo.
goto end
)
rem .
setlocal enabledelayedexpansion
if "%3"=="" (
for /l %%x in (%1, 1, %2) do (
echo.%%x
)
) else (
set "mynum="
for /l %%x in (%1, 1, %2) do (
call set "mynum=00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000%%x"
call set "mynum=%%mynum:~-%3%%"
call echo.%%mynum%%
)
)
:end