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

goucqfw6  于 2022-11-18  发布在  Windows
关注(0)|答案(8)|浏览(277)

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

fcwjkofz

fcwjkofz1#

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

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%

现在PADDED保存填充后的值,如果X的初始值有可能超过两位数,你需要检查一下你没有不小心把它截断:

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陈述式内,以防止这些变更被外界看到。

lyfkaqu1

lyfkaqu12#

如果您确信原始数字的位数始终〈= 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%"

上述算法的优点在于,将填充扩展到任意宽度是很简单的。

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

防止截断

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

ctehm74n3#

单线

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

将为指定范围内的数字获取所需的值。如果子集0-9中的值已经是单填充的,则它不会更改这些值。

qzlgjiam

qzlgjiam4#

前面的答案已经解释了所有现有的方法来填补一个值与左零;我只想增加一个小技巧,我曾经用一种更简单的方式来实现这个目的。在前面的答案中没有提到的是,在大多数情况下,* 要填充的值在循环中递增 *,而填充的值 * 只是用来显示它 *(或类似的任务,如重命名)。例如,要显示从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

此方法也适用于要填充的任意数量的左零。
安东尼奥

cwdobuhd

cwdobuhd5#

好了,伙计们,我找到了一个解决办法,尽可能简单地压缩它。

@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

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

s71maibg

s71maibg6#

这个例子使用了一个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
unhi4e5o

unhi4e5o7#

@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
hjqgdpho

hjqgdpho8#

这就容易多了:

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

相关问题