【问题标题】:String processing in windows batch files: How to pad value with leading zeros?Windows批处理文件中的字符串处理:如何用前导零填充值?
【发布时间】:2012-11-15 13:34:06
【问题描述】:

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

【问题讨论】:

标签: windows batch-file


【解决方案1】:

如果您确信原始数字中的位数始终为

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

【讨论】:

  • 如果你愿意,你可以把setlocal enableDelayedExpansion放在hte if块里面,所以除非你需要它不会改变。
【解决方案2】:

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

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) 你不应该使用 TEMP 作为变量名。它保留指向临时文件的存储位置。覆盖该值可能会破坏其他地方的代码。 2)如果您的原始数字的前导数字是 9 或 8,您的截断测试会中断,因为 SET /A 将以零为前缀的数字视为十六进制,而 08 和 09 会导致错误,因为它们是无效的十六进制表示法。
  • @dbenham:“显然”这不是一个完全封装的解决方案,就像任何设置环境变量的代码一样,它必须放在SETLOCAL/ENDLOCAL 中。你觉得这应该写出来吗?关于零前缀,我不知道——会调查。
  • @dbenham:在我看来,在两个数字前面加上1,然后再减去就可以了。粗鲁但有效。
  • @dbenham: ...并添加了关于SETLOCAL的警告。非常感谢您的意见。
  • 正如 dbenham 所说,使用“temp”是个坏主意,即使使用 setlocal,如果您的批处理因语法错误而停止,endlocal 也不会被执行
【解决方案3】:

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

@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

希望对你有帮助^^

【讨论】:

    【解决方案4】:

    单行

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

    将在您指定的范围内为您提供所需的数字。如果子集 0-9 中的值已经是单填充的,则它不会更改它们。

    【讨论】:

    • 一个简单的循环将零填充到任意位数。又好又短。
    【解决方案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
    

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

    安东尼奥

    【讨论】:

      【解决方案6】:

      本示例使用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
      

      【讨论】:

      • 其实和乔恩的回答逻辑不一样。如果您只想填充 2 位数字,您的解决方案可以正常工作。但是当您填充额外的零时,它会变得很麻烦。
      • @dbenham OP 说I'd like to having leading zeros for values lower than 10. - 那么怎么会有超过 2 位数的呢?我并不是想将其与乔恩的答案进行比较,我将编辑我的答案。
      • 啊,我现在明白我是如何误解你的语言了。确实,问题中的详细信息指定了 2 位数字,但标题更笼统。如果它像特殊情况一样简单,那么有一个通用的解决方案总是很好的。
      • 不知道为什么这不是实际答案,似乎可以更快更简单地完成问题。我只是替换 ECHO 然后设置值,然后 ECHO 或将其传递到任何地方。
      【解决方案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
      

      【讨论】:

        【解决方案8】:

        这更容易:

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

        【讨论】:

          猜你喜欢
          • 2021-05-12
          • 1970-01-01
          • 2019-05-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-13
          • 1970-01-01
          • 2020-07-31
          相关资源
          最近更新 更多