Обработка строк в пакетных файлах Windows: как установить значение с начальными нулями?

в командном файле cmd (.bat) Windows, как я набираю числовое значение, так что заданное значение в диапазоне 0..99 преобразуется в строку в диапазоне от "00" до "99". То есть Я бы хотел иметь ведущие нули для значений ниже 10.

Ответы

Ответ 1

Имеется двухэтапный процесс, который вы можете использовать:

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 содержит добавленное значение. Если есть вероятность, что начальное значение X может иметь более 2 цифр, вам нужно проверить, что вы случайно не усекали его:

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%

Важное примечание:

Это решение создает или перезаписывает переменные PADDED и VERIFY. Любой script, который устанавливает значения переменных, которые не должны сохраняться после завершения, должен быть помещен внутри операторов SETLOCAL и ENDLOCAL, чтобы эти изменения не были видны из внешнего мира.

Ответ 2

Если вы уверены, что количество цифр в вашем исходном номере всегда меньше 2, то

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

Если число может превышать 2 цифры, и вы хотите отложить до 2 цифр, но не обрезать значения, превышающие 99, тогда

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

Или без задержки расширения, используя промежуточную переменную

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

Самое приятное в отношении вышеперечисленных алгоритмов - это тривиально расширить прописку до любой произвольной ширины. Например, чтобы проложить ширину 10, просто добавьте 9 нулей и сохраните последние 10 символов.

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

Чтобы предотвратить усечение

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

Ответ 3

Единственная строка

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

предоставит вам то, что вы хотите для чисел в указанном вами диапазоне. Он не изменяет значения в подмножестве 0-9, если они уже однокомпонентны.

Ответ 4

Предыдущие ответы объясняли все существующие методы для ввода значения с левыми нулями; Я просто хочу добавить небольшой трюк, который я использовал, чтобы сделать это проще. В предыдущих ответах недостаточно упоминалось, что в большинстве случаев значение, которое будет дополнено, увеличивается внутри цикла и что добавленное значение просто используется для его отображения (или аналогичных задач, таких как переименования). Например, чтобы показать значения от 00 до 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

Если это так, значение переменной может использоваться как для управления циклом, так и для отображения его дополненного значения без изменений, если его пределы соответствующим образом переведены. Например, чтобы показать значения от 00 до 99:

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

Этот метод работает также с любым количеством левых нулей для ввода.

Антонио

Ответ 5

В этом примере используется цикл for для демонстрации, но логика такая же, даже если вы должны использовать ее без цикла. Просто echo a 0 впереди, если число меньше 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

Ответ 6

ОК GUYS я нашел решение, сжимая его как можно проще.

@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

это отобразит ваш номер счета, используя 4 цифры. но код может быть изменен, чтобы использовать 2 цифры, как показано ниже.

@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

если вы хотите установить его как отображаемую единую переменную...

@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

если вы хотите, чтобы он подсчитывал в секундах...

@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

Надеюсь, это было большой помощью ^^

Ответ 7

@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