2012-11-15 9 views
18

, मैं संख्यात्मक मान कैसे पैड करूं, ताकि 0.99 की श्रेणी में दिया गया मान "00" से "99" श्रेणी में एक स्ट्रिंग में परिवर्तित हो जाए। अर्थात। मैं अग्रणी शून्य वहाँ एक दो चरणों वाली प्रक्रिया का उपयोग कर सकते है की तुलना में 10विंडोज बैच फ़ाइलों में स्ट्रिंग प्रसंस्करण: अग्रणी शून्य के साथ पैड मूल्य कैसे करें? Windows12d बैच फ़ाइल (.bat) में

+1

रॉब वैन डेर वाउडे [कई अलग-अलग तरीकों की सूची] [http://www.robvanderwoude.com/battech_leadingzero.php) दोनों को जोड़ने और निकालने के लिए अपने पेशेवरों और विपक्ष के साथ ading-zeros। – Synetech

उत्तर

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 गद्देदार मूल्य रखती है। अगर कोई संभावना है कि अधिक से अधिक 2 अंक हो सकता है X का प्रारंभिक मूल्य है, तो आप जांच करने की आवश्यकता है कि आप गलती से इसे काट-छांट नहीं की थी:

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

इस उत्तर के साथ दो समस्याएं हैं। 1) आपको किसी चर नाम के रूप में कभी भी TEMP का उपयोग नहीं करना चाहिए। यह इंगित करने के लिए आरक्षित है कि temp फ़ाइलों को कहाँ संग्रहीत किया जाता है। मूल्य ओवरराइड करने से कहीं और कोड तोड़ सकता है। 2) ट्रंकेशन ब्रेक के लिए आपका परीक्षण यदि आपकी मूल संख्या का अग्रणी अंक 9 या 8 है क्योंकि एसईटी/ए हेक्साडेसिमल के रूप में शून्य के साथ प्रीफ़िक्स किए गए नंबरों का इलाज करता है, और 08 और 09 परिणामस्वरूप त्रुटि होती है क्योंकि वे अमान्य हेक्स नोटेशन हैं। – dbenham

+0

@ डेबेनहम: "जाहिर है" यह पूरी तरह से encapsulated समाधान नहीं है, और पर्यावरण चर सेट करने वाले किसी भी कोड की तरह इसे 'सेटलोकल'/'एंडलोकल 'के अंदर रखा जाना होगा। क्या आपको लगता है कि यह वर्तनी होनी चाहिए? शून्य उपसर्ग के बारे में, मुझे नहीं पता था - जांच करेगा। – Jon

+0

@ डेबेनहम: कुछ विचारों के बाद मुझे ऐसा लगता है कि घटने से पहले दोनों नंबरों को '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

वास्तव में यह जॉन की जवाब के रूप में एक ही तर्क नहीं है। आपका समाधान ठीक काम करता है अगर आप केवल 2 अंकों के लिए पैड करना चाहते हैं। लेकिन यह के रूप में आप पैड अतिरिक्त शून्य बोझिल हो जाता है। – dbenham

+0

@dbenham ओपी 'कहा कि मैं करना चाहते हैं 10.' की तुलना में कम मूल्यों के लिए अग्रणी शून्य होने - तो कैसे वहाँ कभी होगा अधिक से अधिक 2 अंकों की?मेरा मतलब यह नहीं था कि यह जॉन के जवाब से तुलना करें, मैं अपना जवाब संपादित करूंगा। –

+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!" 
) 

या देरी विस्तार के बिना, एक मैं का उपयोग कर ntermediate चर

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

ठीक है 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 

मैं इस आशा एक महान मदद ^^

संबंधित मुद्दे