Enfernen führender Null(en) mit set a schlägt fehl
Hallo liebe Community,
nach langem Suchen komme ich nicht drauf und benötige Hilfe bei einem BATCH (ja, es MUSS Batch sein, auch, wenn es besseres gibt):
Also irgendwie mißachte ich da wohl irgend ein Zahlenformat, aber ich habe keine Ahnung, wie ich das richtig machen soll.
Zur Info: Ich befinde mich innerhalb einer FOR-Schleife in einer Subroutine, dich ich in der FOR-Schleife per CALL aufrufe.
Eine Eingabe an der Kommandozeile bringt aber gleiche Fehler.
Bei 2-stelligen unter 017 immer 2 weniger
Bei 3-stelligen kommt z.b. bei 0777 als Ergebnis 511 ???
019 z.b. nimmt er gar nicht an.
Fehlermeldung:
Ungültige Zahl. Numerische Konstanten sind entweder dezimale (17),
hexadezimale (0x11) oder oktale (021) Zahlen.
Möchte mir jemand einen Tipp geben, was ich falsch mache, bzw. wie ich es richtig(er) mache?
Kurzer Hintergrund: %cnt% ist in meinem Fall IMMER 3-stellig. D.h. von 001-009, über 010-099 bis hin zu 100-999. Das Beispiel mit 0777 oben habe ich nur zum Testen gemacht, weil ich nicht weiterkam. Da aber das Ergebnis so kurios ist, nannte ich es Euch, vielleicht kommt da jemand schneller auf einen möglichen Fehler. Vielleicht gibt es auch einen anderen Trick ohne set/a?
Bereits im Voraus Besten Dank an alle, die sich die Zeit nehmen, mein Problem zu lesen, zu verstehen und mir zu helfen.
Viele Grüße
Der Schottenrock (da schaut man nicht drunter
P.S. Falls jemand möchte: Ich würde gerne eine Variable prüfen, ob diese numerisch ist (ich damit rechnen kann). set/a bricht hier ab und vieles andere auch...
Einfach wenn %var% = Zahl, dann goto Zahl sonst goto Buchstabe
nach langem Suchen komme ich nicht drauf und benötige Hilfe bei einem BATCH (ja, es MUSS Batch sein, auch, wenn es besseres gibt):
set cnt=017
echo A-%cnt%-
rem erster Test: Hier kommt raus: A-017-
set /a cnt=%cnt%
rem mit dem set/a will ich nun die führenden Nullen entfernen und einen Wert bekommen, mit dem ich rechnen kann
echo B-%cnt%-
rem nächste Prüfung: Hier kommt nun B-15- raus.
rem Bei einstelligen Werten kommt unter 8 immer der richtige Wert raus
Also irgendwie mißachte ich da wohl irgend ein Zahlenformat, aber ich habe keine Ahnung, wie ich das richtig machen soll.
Zur Info: Ich befinde mich innerhalb einer FOR-Schleife in einer Subroutine, dich ich in der FOR-Schleife per CALL aufrufe.
Eine Eingabe an der Kommandozeile bringt aber gleiche Fehler.
Bei 2-stelligen unter 017 immer 2 weniger
Bei 3-stelligen kommt z.b. bei 0777 als Ergebnis 511 ???
019 z.b. nimmt er gar nicht an.
Fehlermeldung:
Ungültige Zahl. Numerische Konstanten sind entweder dezimale (17),
hexadezimale (0x11) oder oktale (021) Zahlen.
Möchte mir jemand einen Tipp geben, was ich falsch mache, bzw. wie ich es richtig(er) mache?
Kurzer Hintergrund: %cnt% ist in meinem Fall IMMER 3-stellig. D.h. von 001-009, über 010-099 bis hin zu 100-999. Das Beispiel mit 0777 oben habe ich nur zum Testen gemacht, weil ich nicht weiterkam. Da aber das Ergebnis so kurios ist, nannte ich es Euch, vielleicht kommt da jemand schneller auf einen möglichen Fehler. Vielleicht gibt es auch einen anderen Trick ohne set/a?
Bereits im Voraus Besten Dank an alle, die sich die Zeit nehmen, mein Problem zu lesen, zu verstehen und mir zu helfen.
Viele Grüße
Der Schottenrock (da schaut man nicht drunter
P.S. Falls jemand möchte: Ich würde gerne eine Variable prüfen, ob diese numerisch ist (ich damit rechnen kann). set/a bricht hier ab und vieles andere auch...
Einfach wenn %var% = Zahl, dann goto Zahl sonst goto Buchstabe
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 370543
Url: https://administrator.de/contentid/370543
Ausgedruckt am: 21.11.2024 um 21:11 Uhr
4 Kommentare
Neuester Kommentar
Hallo,
richtig erkannt - Zahlen mit führenden Nullen werden in Batchscript als Oktal-Zahlen interpretiert (Zahlensystem mit der Basis 8).
Wenn es nur darum geht, führende Nullen zu entfernen:
Allerdings halte ich es für geschickter, führende Nullen erst bei der Ausgabe des Variablenwertes hinzuzufügen und intern mit ganz normalen Zahlen zu operieren, dann hast Du auch keine Probleme mit der Interpretation als Oktal-Zahl.
Um immer eine dreistellige Zahl zu erhalten wäre der Code dann folgendermaßen:
Grüße
Friemler
richtig erkannt - Zahlen mit führenden Nullen werden in Batchscript als Oktal-Zahlen interpretiert (Zahlensystem mit der Basis 8).
Wenn es nur darum geht, führende Nullen zu entfernen:
set "Cnt=0010"
for /f "tokens=* delims=0" %%a in ("%Cnt%") do echo %%a
Allerdings halte ich es für geschickter, führende Nullen erst bei der Ausgabe des Variablenwertes hinzuzufügen und intern mit ganz normalen Zahlen zu operieren, dann hast Du auch keine Probleme mit der Interpretation als Oktal-Zahl.
Um immer eine dreistellige Zahl zu erhalten wäre der Code dann folgendermaßen:
set "CntOut=00%Cnt%"
echo %CntOut:~-3%
Grüße
Friemler
Zitat von @Schottenrock:
Ich habe aber noch eine Verständnisfrage: mit delims=0 legst Du die 0 als Trennzeichen fest und Trennzeichen. Aber warum klappt dann 010 und 100? da sind ja auch nachstehende Nullen und die werden nicht als Trennzeichen gewertet.
Ich habe aber noch eine Verständnisfrage: mit delims=0 legst Du die 0 als Trennzeichen fest und Trennzeichen. Aber warum klappt dann 010 und 100? da sind ja auch nachstehende Nullen und die werden nicht als Trennzeichen gewertet.
Alle führenden Nullen werden durch die Festlegung der 0 als Trennzeichen weggefiltert. Durch die Option
tokens=*
wird jedoch der Rest der Zeichenkette komplett übernommen und der Laufvariablen %%a
zugewiesen.Siehe auch mein Tutorial zur FOR-Schleife
Grüße
Friemler