PHP入門 文字列関数 文字列を整形する(printf関数)
printf関数は、指定された書式文字列に基づいて文字列を整形し、その結果を出力します(戻り値は、整形済み文字列のバイト数)。
構文:printf関数
printf(string $format, mixed … $values):int
$format | 書式文字列 |
$values | 書式に埋め込む文字列 |
書式文字列$formatには、変換指定子と呼ばれるプレイスホルダーを埋め込むことができます。プレイスホルダーとは、引数$valuesで指定された文字列を埋め込む場所です。書式文字列で変換指定子以外の部分はそのまま出力されます。
変換指定子は、「%指定子」の形式で表します。変換指定子に含めることができる指定子には、次のようなものがあります。
指定子 | 概要 | ||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
符号指定子 | 数値に付与する符号(+、-)を指定(負数には既定で「-」が付くので、整数に「+」を強制的に付けるのに使用) | ||||||||||||||||||||||||||
パディング指定子 | 不足している桁を埋めるための文字(既定では空白) | ||||||||||||||||||||||||||
アラインメント指定子 | 「-」を指定した場合に左寄せ(規定は右寄せ) | ||||||||||||||||||||||||||
表示幅指定子 | 全体の表示桁数 | ||||||||||||||||||||||||||
精度指定子 | 小数点以下の桁数(直前の表示幅指定子との区切りを表す「.」が必要) | ||||||||||||||||||||||||||
型指定子 | 引数の型
|
例:単純なパターン
変換指定子(%s)の箇所が引数$valuesによって順番に置き換わります。
<?php
printf('%sは%sです。','山田','音痴');
例:すべての指定子
符号指定子「+」を指定することで、整数に対しても強制的に「+」記号が表示されます。表示幅指定子は、符号や小数点を含めた表示桁を表します。表示幅指定子は、型指定子が文字列の場合にも有効です。アラインメント指定子に「-」を指定した場合は、値が左寄せで表示されます。通常は右寄せで、その場合には「+000.199」のような結果が得られます。
<?php
printf('売上平均(前月比):%+0-8.3f',0.198765);
例:パディング指定子に「*」を指定する
この場合、1.988e-1が10桁から2桁不足しているので、2つの「*」で補われます。パディング指定子に「」(空白)、「0」以外の値を指定する場合、サンプルのように指定子の前に「’」を設置します。型指定子に「e」を指定した場合、数値は指数表現に変換されます。表示幅指定子は指数表現を表す「e」なども含めた桁数を表します。
<?php
printf("売上平均(前月比):%'*10.3e",0.198765);
例:文字列に精度指定子を付けた例
文字列を強制的に指定桁数で切り捨てられます。なお、ここで指定している値はバイト数です。UTF-8は1文字を3バイトで表現するので、「.6」は2文字を表します。「.5」のように中途半端な数値を指定した場合は一部文字が化ける可能性があります。
<?php
printf('%.6sは%sです。','山田太郎様一行は','臭い');
例:引数$valuesを指定順ではなく、任意の順番で書式文字列に埋め込みたい
「$」区切りでインデックス番号を指定してください。(インデックス番号は1から始まります)インデックス番号を埋め込むことで、書式文字列に含まれる変換指定子がたとえば翻訳などによって順番が変わったとしても、引数$valuesには影響が及ばずに済みます。また、インデックス番号を利用することで同じ値を複数の箇所に埋め込めるようになるメリットもあります。
<?php
printf('%2$sは%1$sです。%2$sの大好き','山田','臭い');
printf関数は、整形した文字列をそのまま出力しますが、整形した結果を文字列として返したい場合には、sprintf関数を使用してください。また、引数$valuesを配列として渡したい場合には、vprintf/vsprintf関数を利用することもできます。
<?php
printf('%sは%sです。','山田','臭い');
print sprintf('%sは%sです。','山田','臭い');
vprintf('%sは%sです。',['山田','臭い']);
print vsprintf('%sは%sです。',['山田','臭い']);