web-dev-qa-db-fra.com

Traitement des chaînes dans les fichiers batch Windows: comment compléter la valeur avec des zéros non significatifs?

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.

22
Scrontch

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.

23
Jon

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%"
15
dbenham

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.

8
user3168191

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

5
Aacini

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
1
Bali C

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 ^^

1
Mick
@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
0
gnolt