sprintf

文字列を書式に従って整形する

構文

解説

sprintf は、書式を指定して、その中にパラメータの値を埋め込んで、それを返します。 書式は C 言語の sprintf 関数と同じです。

次のサンプルは整数を 5 桁表記とするために左側に 0 埋めをします。

print sprintf( "%05d", 123 );    # "00123"

0 埋めであれば、年月日でも良く使われます。次の例は月、日、時、分、秒を同時に 0 埋めします。

print sprintf( "%d/%02d/%02d %02d:%02d:%02d", 2023, 3, 4, 8, 5, 0 );   # "2023/03/04 08:05:00"

以上の例で使った書式のうち、%d は数値を表し、%02d は数値を 0 埋めで 2 桁にするという意味になります。 そして、書式の次から与えられた数値は順に書式に割り当てられていきます。

変換記号

変換記号は %d 以外にもさまざまなものが用意されています。

変換記号 説明
%%

パーセント記号そのものを表します。

print sprintf( '%d %%', 100 );    # 100 %
%c

与えられた数値で表される文字に置き換わります。

print sprintf( '%c%c%c', 65, 66, 67 );    # ABC

この数値は、Unicode のコードポイントです。そのため、日本語にも対応しています。

binmode STDOUT, ":utf8";
print sprintf( '%c%c%c', 12354, 12356, 12358 );    # あいう

ただし、日本語のようなマルチバイト文字を扱うと、utf8 フラグが ON の内部文字列が生成されます。 STDOUT やファイルなどに出力する際には注意してください。(上記例では binmode STDOUT, ":utf8"; を宣言することで、STDOUT に対して UTF-8 で外部文字列にしています。)

%s

文字列を表します。

print sprintf( 'Hi, %s.', 'Taro' );    # Hi, Taro.
%d

10 進数の符号付き整数を表します。

print sprintf( 'Temperature: %d degC', -3 );    # Temperature: -3 degC
%u

10 進数の符号なし整数を表します。

print sprintf( 'Humidity: %u %%', 45 );    # Humidity: 45 %
%o

8 進数の符号なし整数を表します。

print sprintf( '%o', 0704 );    # 704
print sprintf( '%o', 10 );      # 12
%x

16 進数の符号なし整数を表します。

print sprintf( '%x', 0xff );    # ff
print sprintf( '%x', 10 );      # a
%e

科学的記数法での浮動小数点数を表します。

print sprintf( '%e', 0.001 );    # 1.000000e-03
%f

固定 10 進数表記法での浮動小数点数を表します。

print sprintf( '%f', 0.001 );    # 0.001000
%g

%e またh %f の表記法での浮動小数点数を表します。

print sprintf( '%g', 0.001 );      # 0.001
print sprintf( '%g', 0.00001 );    # 1e-05
%X

%x と同じく 16 進数の符号なし整数を表しますが、 %x とは異なり大文字で表記されます。

print sprintf( '%X', 0xff );    # FF
print sprintf( '%X', 10 );      # A
%E

%e と同じく科学的記数法での浮動小数点数を表しますが、 %e とは異なり大文字で表記されます。

print sprintf( '%E', 0.001 );    # 1.000000E-03
%G

%g と同じく浮動小数点数を表しますが、 %g とは異なり大文字で表記されます。

print sprintf( '%G', 0.00001 );    # 1E-05
%b

2 進数で符号なし整数を表します。もし書式を %#b とすると、 先頭に 0b が付加されます。

print sprintf( '%b',  14 );    # 1110
print sprintf( '%#b', 14 );    # 0b1110
%B

%b と同じく2 進数で符号なし整数を表しますが、%#B とした場合、 先頭に 0B が付加されます (B が大文字になる)。

print sprintf( '%B',  14 );    # 1110
print sprintf( '%#B', 14 );    # 0B1110

書式に # を入れなければ、%b%B に違いはありません。

%p

ポインター (16 進数表記の Perl の値のアドレス) が出力されます。

my $var = 'Hello';
print sprintf( '%p', $var );    # 5569f0dc6960

※ これに関しては用途が良く分かりません。

%n

%n が記述された直前までの出力文字数を数え、%n の位置に相当する変数に文字数を格納します。

print sprintf( 'Hi, %s.%n', 'Taro', my $count );    # Hi, Taro.
print $count; # 9

この例では、書式として「Hi, %s.%n」が指定されています。 %sTaro に置き換わりますので、 %n の直前までの出力内容は 「Hi, Taro.」で 9 文字です。 %n に相当する変数は $count ですので、 $count に 9 がセットされます。

%a

16 進数の浮動小数点数が出力されます。

print sprintf( '%a', 0.123 ); # 0x1.f7ced916872bp-4
%A

%a と同じく 16 進数の浮動小数点数が出力されますが、%a とは異なり大文字で表記されます。

print sprintf( '%A', 0.123 ); # 0X1.F7CED916872BP-4

以上の書式に加え、下位互換性のために以下の書式もサポートされています。

変換記号 説明
%i

%d と同じで、10 進数の符号付き整数を表します。

print sprintf( 'Temperature: %i degC', -3 );    # Temperature: -3 degC
%D

%ld と同じで、10 進数の符号付き 32 ビット整数を表します。

print sprintf( '%D', -3 );    # -3
%U

%lu と同じで、10 進数の符号なし 32 ビット整数を表します。

print sprintf( '%U', 3 );    # 3
%O

%lo と同じで、8 進数の符号なし 32 ビット整数を表します。

print sprintf( '%O', 10 );    # 12
%F

%f と同じで、固定 10 進数表記法での浮動小数点数を表します。

print sprintf( '%F', 0.001 );    # 0.001000

書式パラメータインデックス

sprintf では、書式に登場する変換記号の順番に、それに相当する値をリストとして与えますが、 その順番を意図的に変更することが可能です。

print sprintf( '%s and %s',     'Taro', 'Jiro' );    # Taro and Jiro (通常の場合)
print sprintf( '%2$s and %1$s', 'Taro', 'Jiro' );    # Jiro and Taro (順番を変えた場合)

1 行目は順番を変更しないノーマルのパターンです。2 行目はリストに与えた値の置換の順番が逆になっています。 これは書式の中の 2$1$ で制御しています。 これにより、リストに与える値の順番を自由自在に変更することができます。

フラグ

フラグとは、書式の % と置換記号 (ds など) の手前に記述して、 整形の細かい調整を指示します。

フラグ 説明
スペース

数値が 0 以上の場合、手前にスペースを 1 つ加えます。0 より小さい数値の場合にはスペースは挿入されません。

print sprintf( '% d', 123 );     # " 123"
print sprintf( '% d', -123 );    # "-123"
+

数値が 0 以上の場合、手前に + を 1 つ加えます。0 より小さい数値の場合には + は挿入されません。

print sprintf( '%+d', 123 );     # "+123"
print sprintf( '%+d', -123 );    # "-123"
-

文字列を左寄せにして、右側にスペースを埋めることで所定の長さに揃えます。

print sprintf( '%8s',  'Hello' );    # "   Hello"
print sprintf( '%-8s', 'Hello' );    # "Hello   "
0

数値を右寄せにして、左側に 0 を埋めることで所定の長さに揃えます。

print sprintf( '%05d', 123 );     # "00123"
print sprintf( '%05d', -123 );    # "-0123"
#

8 進数では先頭に 0 を挿入します。 16 進数では 0x または 0X を先頭に挿入します。 2 進数では 0b または 0B を先頭に挿入します。

# 8 進数
print sprintf( '%#o', 10 );    # "012"

# 16 進数
print sprintf( '%#x', 29 );    # "0x1d"
print sprintf( '%#X', 29 );    # "0X1D"

# 2 進数
print sprintf( '%#b', 14 );    # "0b1110"
print sprintf( '%#B', 14 );    # "0B1110"

文字列の表示幅

表示桁数を合わせるために、数字の 0 埋め、文字列宇野スペース埋めは良く行われます。 sprintf には 0 やスペースで埋めることで表示幅を固定にすることができます。

次の文字列の桁合わせの例です。 % の後ろに数字を入れることで表示幅を指定することができます。 デフォルトでは文字列は右寄せになり、スペースは左側に挿入されます。 一方、負の数字を指定すると、文字列は左寄せになり、右側にスペースが挿入されます。

# 文字列の左側にスペースを埋めて桁を合わせる
print sprintf('%6s', 'Perl'); # "  Perl"

# 文字列の右側にスペースを埋めて桁を合わせる
print sprintf( '%-6s', 'Perl' );    # "Perl  "

なお、もし文字列が指定文字数より長い場合は、何もしません。

浮動小数点数の表示精度

sprintf は、11.00 と表示するなど、 浮動小数点数の小数点以下の桁数を合わせることができます。

print sprintf( '%f',   1 );    # "1.000000"
print sprintf( '%.0f', 1 );    # "1"
print sprintf( '%.1f', 1 );    # "1.0"
print sprintf( '%.2f', 1 );    # "1.00"
print sprintf( '%.3f', 1 );    # "1.000"

その他の変換

sprintf には、他にも様々な書式が用意されています。 すべての書式を知りたい方は、 公式のドキュメントをご覧ください。