sprintfの書式指定を使いこなして数値と文字列を整える
sprintfは、書式文字列に沿って数値や文字列を整形し結果を返す関数です。ゼロ埋め・桁揃え・小数点以下の桁固定などを一行で表現できる書き方ですね。
ゼロ埋めと桁数指定の基本
連番のファイル名や伝票番号でゼロ埋めしたいとき、いちいち str_pad を書くよりも sprintf の %05d が手っ取り早いですね。%05d は「全体5桁、足りない分はゼロで埋める整数」という意味です。
echo sprintf('%05d', 42); // 00042
echo sprintf('IMG_%04d.jpg', 7); // IMG_0007.jpg
ゼロではなく空白で埋めたいなら %5d のように 0 を外します。右詰めがデフォルトで、左詰めにしたいときは %-5d とマイナスを付けます。この左詰めは一覧表示の桁揃えでよく使いますね。
小数点以下の桁数を固定する
金額や割合の表示で地味に効くのが %.2f です。小数第2位で四捨五入して固定表示してくれるので、0.1 + 0.2 みたいな浮動小数の見た目のブレを吸収できます。
echo sprintf('%.2f', 3.14159); // 3.14
echo sprintf('%.2f', 0.1 + 0.2); // 0.30
echo sprintf('%\'*8.2f', 12.5); // ***12.50(*でパディング)
パディング文字を変えたいときは、シングルクォートの直後に埋め文字を書きます。上の例では * で幅8に揃えています。この記法は忘れがちなので、たまに使うとおおっとなりますね。
引数の順番を入れ替える番号指定
多言語対応のメッセージなどで、言語によって語順が変わる場合は %1$s のように引数番号を指定できます。同じ引数を複数回使い回すのにも便利です。
$fmt = '%1$s さんは %2$d 歳、%1$s さんの登録日は…';
echo sprintf($fmt, '田中', 30);
// 田中 さんは 30 歳、田中 さんの登録日は…
まとめ
sprintf は書式文字列さえ覚えてしまえば、ゼロ埋め・桁揃え・小数固定を一行で片付けられる便利な道具ですね。printf は直接出力、sprintf は文字列を返す、という違いだけ押さえておけば使い分けに迷うことはないと思います。番号指定まで知っておくと、翻訳ファイルを触るときに助かる場面が出てくるはずです。
よくある質問
Q. printfとsprintfの違いは何ですか。
A. printfは整形結果を直接出力し、sprintfは文字列として返します。変数に入れて後で使うならsprintfですね。
Q. ゼロ埋めではなく空白で埋めたいときは。
A. %05dの0を外して%5dと書きます。左詰めにしたいときは%-5dとマイナスを付けます。