web-dev-qa-db-ja.com

バッチファイルの先行ゼロを削除する

私のアプリケーションでは、先行ゼロを持つ数値を取得します。先行ゼロをトリミングして実際の数を取得しようとしています。割り当ての右側を算術式と見なす/aスイッチを使用してみました。だから私は試しました:

SET /a N = 00027

上記の結果、23の出力が得られました。これは8進数27。それから私は この解決策 オンラインを見つけました。

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

これは機能しているようで、出力27を提供しています。バッチファイルの先行ゼロをトリミングするもっと簡単な方法はありますか?

20
Mahesh

あなたが見つけた方法はとても良いです。 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"
18
dbenham

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の削除の詳細については、 このリンク を参照してください。

P.S. %%aのバッチファイルで実行している場合は、%aの代わりにFOR /Fを使用することを忘れないでください。

4
Dale

Exitコマンドは、先行ゼロをクリアするのに非常に優れています。

>set n=0000890

>cmd /c exit /b %n%

>echo %errorlevel%
890

これにより、最大32ビットの整数制限を使用でき、cmd.exeをさらに呼び出すとパフォーマンスが低下する可能性がありますが、コードの一部は非常に小さくなります。

4
npocmaka