Windows批处理文件中的字符串处理:如何使用前导零填充值?

时间:2012-11-15 13:34:07

标签: windows batch-file

在Windows cmd批处理文件(.bat)中,如何填充数值,以便0..99范围内的给定值转换为“00”到“99”范围内的字符串。即我希望值低于10的前导零。

8 个答案:

答案 0 :(得分:24)

您可以使用两个阶段的流程:

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%

重要提示:

此解决方案创建或覆盖变量PADDEDVERIFY。任何设置变量值的脚本都应该放在SETLOCALENDLOCAL语句中,以防止这些变量在外部世界可见。

答案 1 :(得分:15)

如果您确信原始号码中的位数始终为< = 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%"

答案 2 :(得分:8)

单行

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

可以获得您指定范围内的数字所需的内容。如果它们已经是单填充的,它不会更改子集0-9中的值。

答案 3 :(得分:5)

之前的答案解释了用左零填充值的所有现有方法;我只是想以一种更简单的方式添加一个我曾经做过的小技巧。在以前的答案中没有提到的是,在大多数情况下,将填充的值在循环中递增并且填充值仅用于显示它(或类似的任务,如重命名)。例如,要显示从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

此方法也适用于任意数量的左零填充。

安东尼奥

答案 4 :(得分:2)

OK 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

我希望这是一个很好的帮助^^

答案 5 :(得分:1)

此示例使用for循环来演示,但即使您在没有循环的情况下使用它,逻辑也是相同的。如果数字小于10,则只需echo一个0

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 :(得分:0)

@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

答案 7 :(得分:0)

要容易得多:

set build_b=00%your_value%
set padded_value=%build_b:~-2%