webentwicklung-frage-antwort-db.com.de

String-Verarbeitung in Windows-Batchdateien: Wie wird der Wert mit führenden Nullen aufgefüllt?

wie fülle ich in einer Windows-Cmd-Batchdatei (.bat) einen numerischen Wert ein, sodass ein angegebener Wert im Bereich von 0..99 in eine Zeichenfolge im Bereich von "00" bis "99" umgewandelt wird. Das heißt Ich möchte führende Nullen für Werte unter 10 haben.

22
Scrontch

Es gibt einen zweistufigen Prozess, den Sie verwenden können:

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%

Jetzt enthält TEMP den aufgefüllten Wert. Wenn die Wahrscheinlichkeit besteht, dass der Anfangswert von X mehr als zwei Ziffern enthält, müssen Sie prüfen, ob Sie ihn nicht versehentlich abgeschnitten haben:

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%

Wichtige Notiz:

Diese Lösung erstellt oder überschreibt die Variablen PADDED und VERIFY. Jedes Skript, das die Werte von Variablen festlegt, die nach dem Beenden nicht persistent sein sollen, sollte in SETLOCAL- und ENDLOCAL -Anweisungen eingefügt werden, um zu verhindern, dass diese Änderungen von außen sichtbar sind.

23
Jon

Wenn Sie sicher sind, dass die Anzahl der Ziffern in Ihrer ursprünglichen Zahl immer <= 2 ist, dann

set "x=0%x%"
set "x=%x:~-2%"

Wenn die Anzahl 2 Ziffern überschreiten kann und Sie 2 Ziffern auffüllen möchten, aber Werte, die größer als 99 sind, nicht abschneiden, dann

setlocal enableDelayedExpansion
if "%x%" equ "%x:~-2%" (
  set "x=0%x%"
  set "x=!x:~-2!"
)

Oder ohne verzögerte Erweiterung mit einer Zwischenvariablen

set paddedX=0%x%
if "%x%" equ "%x:~-2%" set "x=%paddedX:~-2%"

Das Schöne an den oben genannten Algorithmen ist, dass es einfach ist, die Polsterung auf eine beliebige Breite zu erweitern. Um beispielsweise die Breite 10 aufzufüllen, voranstellen Sie einfach 9 Nullen und behalten die letzten 10 Zeichen bei

set "x=000000000%x%"
set "x=%x:~-10%"

, Um das Abschneiden zu verhindern

set paddedX=000000000%x%
if "%x%" equ "%x:~-10%" set "x=%paddedX:~-10%"
15
dbenham

Die einzelne Zeile

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

erhalten Sie, was Sie für Zahlen in dem von Ihnen angegebenen Bereich wünschen. Werte in der Teilmenge 0-9 werden nicht geändert, wenn sie bereits einzeln aufgefüllt sind.

8
user3168191

In früheren Antworten wurden alle vorhandenen Methoden erläutert, um einen Wert mit linken Nullen aufzufüllen. Ich möchte nur einen kleinen Trick hinzufügen, mit dem ich das einfacher gemacht habe. Was in den vorangegangenen Antworten nicht genug erwähnt wurde, ist, dass in den meisten Fällen der aufgefüllte Wert innerhalb einer Schleife erhöht wird und dass der aufgefüllte Wert nur zur Anzeige (oder ähnlicher Aufgaben) verwendet wird. wie umbenannt). So zeigen Sie beispielsweise Werte von 00 bis 99 an:

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

Wenn dies der Fall ist, kann der Wert der Variablen sowohl für die Steuerung der Schleife als auch für die Anzeige von verwendet werden, ohne dass der aufgefüllte Wert geändert wird, wenn seine Grenzen entsprechend übersetzt werden. So zeigen Sie beispielsweise Werte von 00 bis 99 an:

set x=100
:loop
   rem Show padded value
   echo %x:~-2%
   set /A x+=1
if %x% leq 199 goto loop

Diese Methode funktioniert auch mit einer beliebigen Anzahl von linken Nullen zum Auffüllen.

Antonio

5
Aacini

In diesem Beispiel wird eine for-Schleife zur Veranschaulichung verwendet. Die Logik ist jedoch dieselbe, auch wenn Sie sie ohne die Schleife verwenden würden. Nur echo einen 0 vor, wenn die Zahl weniger als 10 ist. 

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
1
Bali C

OK GUYS Ich habe eine Lösung gefunden, die so einfach wie möglich komprimiert wird.

@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

dadurch wird Ihre Count-Up-Nummer mit 4 Ziffern angezeigt. Der Code kann jedoch so geändert werden, dass er zwei Ziffern verwendet (siehe unten).

@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

wenn Sie es als anzeigbare Einzelvariable festlegen wollen ...

@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

wenn Sie möchten, dass es in Sekunden zählt ...

@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

ich hoffe das war eine große hilfe ^^

1
Mick
@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
0
gnolt