29

Windows cmd バッチ ファイル (.bat) で、0..99 の範囲の特定の値が "00" から "99" の範囲の文字列に変換されるように、数値をパディングする方法を教えてください。つまり、10 未満の値の先頭にゼロを付けたいと思います。

4

8 に答える 8

28

使用できる 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パディングされた値を保持するようになりました。の初期値がX2 桁を超える可能性がある場合は、誤って切り捨てていないことを確認する必要があります。

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。終了後に永続化することを意図していない変数の値を設定するスクリプトは、これらの変更が外部から見えないようにステートメント内に配置する必要がありますSETLOCALENDLOCAL

于 2012-11-15T13:43:29.493 に答える
17

元の数値の桁数が常に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%"
于 2012-11-15T15:49:41.180 に答える
8

シングルライン

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

指定した範囲の数値に必要なものが得られます。すでにシングルパディングされている場合、サブセット 0 ~ 9 の値は変更されません。

于 2015-04-25T12:09:33.747 に答える
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

この方法は、パディングする任意の数の左側のゼロでも機能します。

アントニオ

于 2012-11-16T05:55:05.987 に答える
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
于 2012-11-15T13:46:51.137 に答える
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
于 2015-03-14T20:06:38.663 に答える