Windows cmd バッチ ファイル (.bat) で、0..99 の範囲の特定の値が "00" から "99" の範囲の文字列に変換されるように、数値をパディングする方法を教えてください。つまり、10 未満の値の先頭にゼロを付けたいと思います。
8 に答える
使用できる 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%
重要な注意点:
PADDED
このソリューションは、変数およびを作成または上書きしますVERIFY
。終了後に永続化することを意図していない変数の値を設定するスクリプトは、これらの変更が外部から見えないようにステートメント内に配置する必要がありますSETLOCAL
。ENDLOCAL
元の数値の桁数が常に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%"
シングルライン
IF 1%Foo% LSS 100 SET Foo=0%Foo%
指定した範囲の数値に必要なものが得られます。すでにシングルパディングされている場合、サブセット 0 ~ 9 の値は変更されません。
以前の回答では、値に左ゼロを埋め込む既存の方法がすべて説明されていました。以前は簡単な方法で行っていた小さなトリックを追加したいだけです。以前の回答で十分に言及されていなかったのは、ほとんどの場合、パディングされる値はループ内でインクリメントされ、パディングされた値はそれを表示するためだけに使用される(または名前変更などの同様のタスク) ということです。たとえば、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
この方法は、パディングする任意の数の左側のゼロでも機能します。
アントニオ
この例では、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
@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