2013-02-07 24 views
17

In meiner Anwendung bekomme ich eine Nummer mit führenden Nullen. Ich versuche, die führenden Nullen zu trimmen und die tatsächliche Nummer zu erhalten. Ich versuchte, /a Schalter zu verwenden, der rechte Seite der Zuordnung als einen arithmetischen Ausdruck betrachtet. Also habe ich versucht:Entfernen Sie führende Nullen in Batch-Datei

SET /a N = 00027 

Die oben gab mir die Ausgabe von , die die entsprechenden Dezimalzahl Octalzahl . Dann habe ich online this solution gefunden.

SET N = 00027 
SET /a N = 1%N%-(11%N%-1%N%)/10 

Dies scheint zu funktionieren und gibt den Ausgang . Gibt es eine viel einfachere Möglichkeit, die führenden Nullen in einer Batch-Datei zu trimmen?

+0

Nicht, dass ich finden kann. Das Problem ist, dass, wie Sie sehen können, die führende Null ohne folgendes 'x' anzeigt, dass Sie eine Oktalzahl verwenden (' 0x0027' steht für eine Hexzahl).Die einzige Möglichkeit, es zu entfernen, besteht darin, einen Wert ungleich Null auf der linken Seite zu verketten, damit er als Dezimalwert erscheint, und dann die hinzugefügte Menge zu entfernen. (Sie können die unterstützten Zahlenformate sehen, wenn Sie einen bekannten ungültigen Wert in der Operation verwenden, wie 'set/a N = d/1', was 'Ungültige Zahl' ergibt. Numerische Konstanten sind entweder dezimal (17), hexadezimal (0x11), oder oktal (021). ". –

+1

Sie haben eine One-Liner-Lösung gefunden, die das macht, was Sie wollen. Was brauchen Sie sonst noch? :) – mrt

+0

Siehe auch: http://www.robvanderwoude.com/battech_leadingzero.php –

Antwort

14

Die Methode, die Sie gefunden haben, ist sehr gut. Es unterstützt Nummern bis 99.999.999 und ist sehr schnell.

Es gibt einen einfacheren Weg, SET/A zu verwenden, der mit Zahlen bis zu 9999 arbeitet. Es verwendet die Modulus-Operation. Die Methode kann nicht auf größere Zahlen erweitert werden.

set n=0027 
set /a n=10000%n% %% 10000 

Die FOR/F-Methode, die Dale Werke mit "jeder" Größe Nummer gebucht (bis zu 8.191 Stellen). Es erfordert jedoch nur ein wenig mehr Arbeit, um Nullwerte zu behandeln.

set n=000000000000000000000000000000000000000000000000000027 
for /f "tokens=* delims=0" %%N in ("%n%") do set "n=%%N" 
if not defined n set "n=0" 

Es ist möglich, die gleiche Sache mit einer einzigen Zeile zu tun, || für die IF-Anweisung zu ersetzen. Die FOR/F-Anweisung löst einen stillen Fehler aus, wenn keine Iterationen vorhanden sind.

set n=000000000000000000000000000000000000000000000000000027 
(for /f "tokens=* delims=0" %%N in ("%n%") do set "n=%%N")||set "n=0" 
4

Sie können FOR /F verwenden, um führende Nullen zu entfernen.

C:\>SET n=00030 
echo off 
for /f "tokens=* delims=0" %a in ("%n%") DO echo %a 
30 

Wie Sie sehen können, ist die delims auf 0 gesetzt Dies wird 0 als Trennzeichen macht. Zur gleichen Zeit mit tokens von * wird dies sicherstellen, dass die führenden Nullen entfernt werden, während der Rest der Zeile verarbeitet wird (einschließlich der abschließenden Nullen).

Sie können sich auf this link beziehen, um weitere Informationen zum Entfernen von führenden Nullen zu erhalten.

P.S. Denken Sie daran, %%a anstelle von %a zu verwenden, wenn Sie eine Batchdatei unter FOR /F ausführen.

+0

+1 , aber Sie benötigen ein wenig mehr Arbeit, um 0 Werte zu behandeln – dbenham

4

Der Exit-Befehl ist bei Clearing führenden Nullen ziemlich gut:

>set n=0000890 

>cmd /c exit /b %n% 

>echo %errorlevel% 
890 

dies mit Ihnen Zahl bis zu 32-Bit-Integer-Grenze und das Stück Code ist wirklich klein von, trotz zusätzlichem Anruf nutzen können cmd.exe könnte die Leistung beeinträchtigen.

+1

+1, Gute Methode, aber Sie müssen sich der Einschränkungen bewusst sein ERRORLEVEL ist eine 32-Bit-Ganzzahl mit Vorzeichen mit einem Wert zwischen -2147483648 und 2147483647. Ein EXIT-Wert, der Überschreitet diese Grenze, wird sie innerhalb der Grenzen in einen Wert umgewandelt, zum Beispiel EXIT 4000000000 wird als ERRORLEVEL -294967296 gemeldet – dbenham

-1

Wenn es nur eine Frage Nullen zu entfernen, können Sie es wie folgt tun:

> SET n=00000002304650620000.23094400 
> SET n=%n:0=% 
2346562.23944 
+0

Err, bei * no * point hat die Frage nicht angegeben, dass führende Nullen entfernt werden sollten wie nützlich für die Frage, als hätte ich eine Lasagne Rezept geschrieben :-) – paxdiablo

Verwandte Themen