6

Perl のsprintfを使用して変数をゼロフィルしたいと考えています。

sprintf("%08d", $var);

しかし、ゼロフィルする桁数を動的に決定したいと考えています。

sprintf("%08d", $var)"8"を という変数に置き換えるにはどうすればよい$zerofillですか?

4

3 に答える 3

15

sprintfの最初の引数は単なる文字列です:

 my $zerofill = 9;
 my $number = 1000;
 my $filled = sprintf "%0${zerofill}d", $number;

変数名を文字列の残りの部分から区別する中かっこに注意してください。

文字列は単なる文字列であることを人々に思い出させるために、 Perl の学習における少し巧妙な演習として、この特定の問題があります。:)

ただし、mobrule が彼の回答で指摘しているように、sprintf にはこの種の柔軟性を提供する多くの機能があります。このような一見単​​純な関数のドキュメントは非常に長く、その中には多くの利点があります。

于 2010-03-18T16:01:17.647 に答える
15

sprintf表記法をprintfサポートし*ます (これは少なくとも 5.8 以降で機能しています):


printf "%0*d", 9, 12345;

000012345

printf '$%*.*f', 8, 2, 456.78;

$  456.78
于 2010-03-18T16:06:00.970 に答える
2

少し違うことをする必要がありました。浮動小数点値をゼロで埋めて、正確な長さを取得します。

私の場合、小数点を含めて正確に 12 バイトが必要です。上記のものよりも少しトリッキーです。誰かがこれを必要とする場合に備えて、ここにあります:

$inputVal は、1001.1のような値を持つどこかから渡された文字列であるとします。これが確実に機能するためには、12 文字未満にする必要があることに注意してください。

 # This will give us extra zeros, but the string may be too long
 my $floatVal = sprintf('%*.*f', 12, 12, $inputValue);

 # This will remove any extra zeros
 $result = substr($floatVal, 0, 12);
于 2011-08-25T00:41:49.227 に答える