Procesamiento de cadenas en archivos de proceso por lotes de Windows: cómo ajustar el valor con ceros a la izquierda?

en un archivo por lotes cmd de Windows (.bat), cómo relleno un valor numérico, de modo que un valor dado en el rango 0..99 se transforma en una cadena en el rango “00” a “99”. Es decir, me gustaría tener ceros a la izquierda para valores inferiores a 10.

Hay un proceso de dos etapas que puede usar:

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% 

Ahora TEMP tiene el valor acolchado. Si hay alguna posibilidad de que el valor inicial de X tenga más de 2 dígitos, debe verificar que no lo haya truncado accidentalmente:

 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% 

Nota IMPORTANTE:

Esta solución crea o sobrescribe las variables PADDED y VERIFY . Cualquier secuencia de comandos que establezca los valores de las variables que no deben persistir después de su finalización debe colocarse dentro de las SETLOCAL y ENDLOCAL para evitar que estos cambios sean visibles desde el exterior.

Si está seguro de que la cantidad de dígitos en su número original es siempre menor a 2, entonces

 set "x=0%x%" set "x=%x:~-2%" 

Si el número puede superar los 2 dígitos, y desea rellenar dos dígitos, pero no truncar valores mayores que 99, entonces

 setlocal enableDelayedExpansion if "%x%" equ "%x:~-2%" ( set "x=0%x%" set "x=!x:~-2!" ) 

O sin demora en la expansión, utilizando una variable intermedia

 set paddedX=0%x% if "%x%" equ "%x:~-2%" set "x=%paddedX:~-2%" 

Lo bueno de los algoritmos anteriores es que es trivial extender el relleno a cualquier ancho arbitrario. Por ejemplo, para rellenar hasta el ancho 10, simplemente antepende con 9 ceros y conserve los últimos 10 caracteres

 set "x=000000000%x%" set "x=%x:~-10%" 

PARA evitar truncar

 set paddedX=000000000%x% if "%x%" equ "%x:~-10%" set "x=%paddedX:~-10%" 

La sola línea

 IF 1%Foo% LSS 100 SET Foo=0%Foo% 

obtendrá lo que desea para los números en el rango que especifique. No cambia los valores en el subconjunto 0-9 si ya tienen relleno único.

Las respuestas anteriores habían explicado todos los métodos existentes para rellenar un valor con ceros a la izquierda; Solo quiero agregar un pequeño truco que solía hacer de una manera más fácil. Lo que no se mencionó lo suficiente en las respuestas anteriores es que, en la mayoría de los casos, el valor que se rellenará se incrementa dentro de un bucle y que el valor acolchado solo se usa para mostrarlo (o tareas similares, como cambiar el nombre). Por ejemplo, para mostrar valores de 00 a 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 este es el caso, el valor de la variable se puede usar para controlar el ciclo y mostrar su valor acolchado sin modificación si sus límites se traducen adecuadamente. Por ejemplo, para mostrar valores de 00 a 99:

 set x=100 :loop rem Show padded value echo %x:~-2% set /A x+=1 if %x% leq 199 goto loop 

Este método también funciona con cualquier cantidad de ceros a la izquierda para rellenar.

Antonio

Este ejemplo usa un bucle for para demostrar, pero la lógica es la misma incluso si fuera a usarla sin el bucle. Solo echo un 0 en el frente si el número es menor a 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 CHICOS, he encontrado una solución, comprimiéndola lo más simple posible.

 @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 

esto mostrará su número de cuenta ascendente usando 4 dígitos. pero el código puede ser alterado para usar 2 dígitos como se muestra a continuación.

 @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 desea establecerlo como una variable individual visualizable …

 @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 quieres que cuente en segundos …

 @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 

Espero que haya sido de gran ayuda ^^

 @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