文字列を書式に従って整形する
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
以外にもさまざまなものが用意されています。
変換記号 | 説明 |
---|---|
%% |
パーセント記号そのものを表します。
|
%c |
与えられた数値で表される文字に置き換わります。
この数値は、Unicode のコードポイントです。そのため、日本語にも対応しています。
ただし、日本語のようなマルチバイト文字を扱うと、utf8 フラグが ON の内部文字列が生成されます。
STDOUT やファイルなどに出力する際には注意してください。(上記例では
|
%s |
文字列を表します。
|
%d |
10 進数の符号付き整数を表します。
|
%u |
10 進数の符号なし整数を表します。
|
%o |
8 進数の符号なし整数を表します。
|
%x |
16 進数の符号なし整数を表します。
|
%e |
科学的記数法での浮動小数点数を表します。
|
%f |
固定 10 進数表記法での浮動小数点数を表します。
|
%g |
|
%X |
|
%E |
|
%G |
|
%b |
2 進数で符号なし整数を表します。もし書式を
|
%B |
書式に |
%p |
ポインター (16 進数表記の Perl の値のアドレス) が出力されます。
※ これに関しては用途が良く分かりません。 |
%n |
この例では、書式として「 |
%a |
16 進数の浮動小数点数が出力されます。
|
%A |
|
以上の書式に加え、下位互換性のために以下の書式もサポートされています。
変換記号 | 説明 |
---|---|
%i |
|
%D |
|
%U |
|
%O |
|
%F |
|
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$
で制御しています。
これにより、リストに与える値の順番を自由自在に変更することができます。
フラグとは、書式の %
と置換記号 (d
や s
など) の手前に記述して、
整形の細かい調整を指示します。
フラグ | 説明 |
---|---|
スペース |
数値が 0 以上の場合、手前にスペースを 1 つ加えます。0 より小さい数値の場合にはスペースは挿入されません。
|
+ |
数値が 0 以上の場合、手前に
|
- |
文字列を左寄せにして、右側にスペースを埋めることで所定の長さに揃えます。
|
0 |
数値を右寄せにして、左側に 0 を埋めることで所定の長さに揃えます。
|
# |
8 進数では先頭に 0 を挿入します。
16 進数では
|
表示桁数を合わせるために、数字の 0 埋め、文字列宇野スペース埋めは良く行われます。
sprintf
には 0 やスペースで埋めることで表示幅を固定にすることができます。
次の文字列の桁合わせの例です。
%
の後ろに数字を入れることで表示幅を指定することができます。
デフォルトでは文字列は右寄せになり、スペースは左側に挿入されます。
一方、負の数字を指定すると、文字列は左寄せになり、右側にスペースが挿入されます。
# 文字列の左側にスペースを埋めて桁を合わせる
print sprintf('%6s', 'Perl'); # " Perl"
# 文字列の右側にスペースを埋めて桁を合わせる
print sprintf( '%-6s', 'Perl' ); # "Perl "
なお、もし文字列が指定文字数より長い場合は、何もしません。
sprintf
は、1
を 1.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
には、他にも様々な書式が用意されています。
すべての書式を知りたい方は、
公式のドキュメントをご覧ください。