在Windows cmd批處理文件(.bat)中,我如何填充數字值,以便範圍爲0..99的給定值轉換爲範圍爲「00」到「99」的字符串。即我想有前導零值低於10Windows批處理文件中的字符串處理:如何用前導零填充值?
回答
有你可以使用一個兩階段的過程:
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
語句中,以防止這些變化從外部可見。
這個答案有兩個問題。 1)你不應該使用TEMP作爲變量名稱。它保留指向臨時文件的存儲位置。覆蓋該值可能會在別處破壞代碼。 2)如果原始數字的開頭數字是9或8,則截斷測試會中斷,因爲SET/A將以0爲前綴的數字視爲十六進制數字,而08和09由於它們是無效的十六進制符號而導致錯誤。 – dbenham
@dbenham:「顯然,」這不是一個完全封裝的解決方案,就像任何設置環境變量的代碼一樣,它必須放在SETLOCAL' /'ENDLOCAL'裏面。你覺得應該拼寫出來嗎?關於零前綴,我不知道 - 將調查。 – Jon
@dbenham:經過一番思考,在我看來,在減法之前用'1'前綴兩個數字都可以做到這一點。原油但有效。 – Jon
本示例使用for
循環進行演示,但即使不使用循環,也使用相同的邏輯。只是echo
在前面0
如果數字小於10
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,然後
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!"
)
或者無延遲擴展,使用i中間變量
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裏面,所以它不會改變,除非你需要它。 –
以前的答案已經解釋所有存在的方法來墊的值左零;我只是想添加一個我以前用更簡單的方法做的小竅門。在以前的回答中沒有提到的是,在大多數情況下,將填充的值在循環內遞增,並且填充值僅用於顯示它(或類似任務,如重命名)。例如,將值示出了從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
此方法也適用於填充任意數量的左零。
安東尼
最後,正確的答案 – thefoyer
@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
單線
IF 1%Foo% LSS 100 SET Foo=0%Foo%
會得到你想要的東西在範圍內您指定的數字。它不會更改子集0-9中的值(如果它們已經是單填充的)。
一個簡單的循環將零填充到任意數量的數字。很好,很短。 – mojo
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
我希望這是一個很大的幫助^^
- 1. 如何連接Windows批處理文件中的字符串?
- 2. 如何在Windows批處理文件中拆分字符串?
- 3. 批處理文件字符串串聯
- 4. 從文件填充批處理
- 5. Windows批處理文件在文件名中查找字符串
- 6. 如何從批處理文件中調用批處理文件?
- 7. Windows批處理文件處理 - 循環
- 8. 批處理文件字符串操作
- 9. 刪除批處理文件中的前導零
- 10. C預處理器:用前導零對字符串int進行處理?
- 11. 在Windows批處理文件中回聲確切的字符串?
- 12. windows批處理文件中的字符串循環
- 13. 如何處理Windows批處理文件路徑中的空格?
- 14. Oracle在批處理文件中導入批處理文件
- 15. 批處理文件的Windows
- 16. 如何轉義Windows批處理文件中的保留字符
- 17. 如何自動填充批處理文件中的輸入
- 18. Windows批處理:在文件中查找字符串中帶有「[」的字符串
- 19. 如何從另一個批處理文件調用Windows批處理文件
- 20. 如何從批處理文件調用批處理文件
- 21. 如何在Windows批處理文件中使用引號處理變量值
- 22. 如何編輯批處理文件中的字符串
- 23. 批處理文件 - 如何查找字符串中的引號?
- 24. 檢查批處理文件(Windows)中子字符串的字符串?
- 25. 批處理文件在字符串中找到子字符串
- 26. 批處理文件在字符串中查找字符串
- 27. 批處理文件中的Unicode字符
- 28. 如何使用批處理文件將批處理文件命令追加到字符串(文件名)
- 29. 如何處理windows批處理變量?
- 30. 的Windows批處理文件:環行數和拆分字符串
Rob van der Woude [列出幾種不同的方法](http://www.robvanderwoude.com/battech_leadingzero.php)既添加和刪除文件ading-zeros以及它們的優點和缺點。 – Synetech