2013-02-07 49 views
17

在我的应用程序中,我得到一个具有前导零的数字。我正在修剪前导零并获取实际的数字。我尝试使用/a开关,它将分配的右侧视为算术表达式。所以,我想:删除批处理文件中的前导零

SET /a N = 00027 

上面给我的输出是八进制数的十进制值。然后我在网上找到this solution

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

这似乎是工作,是给输出。是否有更简单的方法来修剪批处理文件中的前导零?

+0

不,我能找到。 :-)问题是,正如你所看到的,没有跟随'x'的前导零表示你正在使用一个八进制数('0x0027'表示一个十六进制数)。删除它的唯一方法是连接左侧的非零值,使其看起来像是一个十进制值,然后除去添加的量。 (你可以看到在操作中使用一个已知的无效值支持的数字格式,比如'set/a N = d/1',它会产生'无效的数字。数字常量是十进制(17),十六进制(0x11),或者八进制(021)“。 –

+1

您找到了一种可以满足您需求的单线解决方案。您还需要什么?:) – mrt

+0

另请参阅:http://www.robvanderwoude.com/battech_leadingzero.php –

回答

14

您发现的方法非常好。它支持高达99,999,999的数字,速度非常快。

有一种更简单的方法来使用SET/A,它可以使用9999以下的数字。它使用模数运算。该方法不能扩展到更大的数字。

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

Dale发布的FOR/F方法使用“任意”大小的数字(最多8191位数字)。但是,它只需要更多的工作来处理零值。

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

它可以做同样的事情用一个单行中,IF语句替换||。如果没有迭代,FOR/F语句会产生无声错误。

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

您可以使用FOR /F删除前导零。

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

正如你所看到的,delims设置为0,这将使得0作为分隔符。 tokens*与此同时,这将确保前导0将被删除,而该行的其余部分将被处理(包括尾随0)。

有关删除前导0的更多信息,请参阅this link

P.S.当您在FOR /F的批处理文件上运行时,请记得使用%%a而不是%a

+0

+1 ,但你需要更多的工作来处理0值 – dbenham

4

exit命令是相当不错的,在结算前导零:

>set n=0000890 

>cmd /c exit /b %n% 

>echo %errorlevel% 
890 

有了这个,你可以使用数高达32位整数的限制和一段代码是非常小的,尽管附加呼叫cmd.exe可能会损害性能。

+1

+1,好的方法,但你需要知道的限制ERRORLEVEL是一个有符号的32位整数,值在-2147483648和2147483647之间。超过这些限制将被转换为限制范围内的一个例如,EXIT 4000000000报告为ERRORLEVEL -294967296。 – dbenham

-1

如果只有删除所有零的问题,你可以做这样的:

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

Err,在* no *点的问题没有指出它是前导零被移除,所以这个答案是关于如对于这个问题很有用,就好像我发布了一个千层面的食谱:-) – paxdiablo