2013-02-07 21 views
17

私のアプリケーションでは、先頭に0が付いた番号を取得します。先行ゼロをトリムして実際の数値を取得しようとしています。私は/aスイッチを使用して試してみました。このスイッチは、割り当ての右側を算術式として考えました。だから私は試してみました:バッチファイルの先行ゼロを削除する

SET /a N = 00027 

は、上記の私に進数の10進数であるの出力を与えました。その後、私はthis solutionをオンラインで見つけました。

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

これは働いているようだと、出力を与えています。バッチファイル内の先行ゼロをトリムする簡単な方法はありますか?

+0

ありません。あなたが見ることができるように、次の 'x 'のない先頭の0は、あなたが8進数を使用していることを示します(' 0x0027'は16進数を示します)。それを削除する唯一の方法は、左に0以外の値を連結して10進数のように見せて、追加された量を削除することです。 ( 'set/a N = d/1'のように、 '無効な数字'を生成するような、操作で知られている無効な値を使用して、サポートされている数値フォーマットを見ることができます。 (021)」を参照してください。 –

+1

必要なものを実行する1ライナーソリューションが見つかりました。その他に必要なもの: – mrt

+0

参照:http://www.robvanderwoude.com/battech_leadingzero.php –

答えて

14

あなたが見つかったメソッドは非常に良いです。それは99,999,999までの数字をサポートし、非常に高速です。

9999までの数字で動作するSET/Aを使用する簡単な方法があります。それはモジュラス演算を使用します。この方法をより大きな数に拡張することはできません。

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 – 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、at * no * pointは、削除される先行ゼロが指定されていませんでした。としてあたかも私がラザニアのレシピを投稿したかのように質問に役立ちます:-) – paxdiablo

関連する問題