2012-11-15 16 views

回答

16

有你可以使用一個兩階段的過程:

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語句中,以防止這些變化從外部可見。

+2

這個答案有兩個問題。 1)你不應該使用TEMP作爲變量名稱。它保留指向臨時文件的存儲位置。覆蓋該值可能會在別處破壞代碼。 2)如果原始數字的開頭數字是9或8,則截斷測試會中斷,因爲SET/A將以0爲前綴的數字視爲十六進制數字,而08和09由於它們是無效的十六進制符號而導致錯誤。 – dbenham

+0

@dbenham:「顯然,」這不是一個完全封裝的解決方案,就像任何設置環境變量的代碼一樣,它必須放在SETLOCAL' /'ENDLOCAL'裏面。你覺得應該拼寫出來嗎?關於零前綴,我不知道 - 將調查。 – Jon

+0

@dbenham:經過一番思考,在我看來,在減法之前用'1'前綴兩個數字都可以做到這一點。原油但有效。 – Jon

1

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

其實它和Jon的答案不一樣,你的解決方案工作正常,如果你只想填充2位數字,但是當你填充額外的零時會變得很麻煩 – dbenham

+0

@dbenham OP說'我想在值低於10時具有前導零。「 - 那麼怎麼會有超過2位的數字呢?我不是故意用它來比較Jon的答案,我會編輯我的答案。 –

+0

啊,我現在看到我是怎麼誤解你的語言的。確實問題中的細節指定了2位數字,但標題更一般。如果它像特殊情況一樣簡單,那麼有一個通用的解決方案總是很好的。 – dbenham

11

如果你有信心,在你原來的號碼的位數總是小於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%" 
+0

如果你願意,你可以把'setlocal enableDelayedExpansion'放在hte裏面,所以它不會改變,除非你需要它。 –

4

以前的答案已經解釋所有存在的方法來墊的值左零;我只是想添加一個我以前用更簡單的方法做的小竅門。在以前的回答中沒有提到的是,在大多數情況下,將填充的值在循環內遞增,並且填充值僅用於顯示它(或類似任務,如重命名)。例如,將值示出了從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 

此方法也適用於填充任意數量的左零。

安東尼

+0

最後,正確的答案 – thefoyer

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 
7

單線

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

會得到你想要的東西在範圍內您指定的數字。它不會更改子集0-9中的值(如果它們已經是單填充的)。

+0

一個簡單的循環將零填充到任意數量的數字。很好,很短。 – mojo

1

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 

我希望這是一個很大的幫助^^

相關問題