PHPのprintf関数とは
PHPのprintf()は、指定した書式に従って文字列や数値を整形し、その結果を直接出力する関数です。
単純に文字列を表示するだけであればechoでも対応できますが、printf()を使うと、整数の桁数を揃えたり、小数点以下の桁数を指定したり、ゼロ埋めしたりできます。
例えば、次のように使用します。
$name = '田中';
$age = 30;
printf('名前:%s、年齢:%d歳', $name, $age);
実行結果は次のとおりです。
名前:田中、年齢:30歳
この例では、%sに文字列の田中、%dに整数の30が埋め込まれています。
printf()は、一定の形式でデータを表示したい場合に特に便利な関数です。
printf関数の基本的な書き方
printfの基本構文
printf()の基本構文は次のとおりです。
printf($format, ...$values);
第1引数には、出力したい文字列と書式指定を含むフォーマット文字列を指定します。
第2引数以降には、フォーマット文字列へ埋め込む値を指定します。
例えば、次のコードを見てみましょう。
printf('商品名:%s、価格:%d円', 'キーボード', 5000);
実行結果は次のとおりです。
商品名:キーボード、価格:5000円
%sと%dのように、値をどの形式で表示するか指定する記号を「書式指定子」と呼びます。
printfの書式指定の基本構造
printf()の書式指定は、おおまかに次のような構造になっています。
%[引数番号$][フラグ][幅][.精度]型指定子
例えば、次のような指定があります。
%s
%d
%.2f
%05d
%-10s
%2$s
すべての要素を使用する必要はありません。
通常は、用途に応じて必要な部分だけを指定します。
printfでよく使う書式指定子
%sで文字列を表示する
%sは、値を文字列として表示するときに使用します。
$language = 'PHP';
printf('使用している言語は%sです。', $language);
実行結果は次のとおりです。
使用している言語はPHPです。
名前や商品名、メッセージなどを組み込む場合によく使用します。
%dで整数を表示する
%dは、整数を10進数として表示するときに使用します。
$age = 25;
printf('年齢は%d歳です。', $age);
実行結果は次のとおりです。
年齢は25歳です。
件数や年齢、IDなどの整数を出力する際に便利です。
%fで小数を表示する
%fは、浮動小数点数を表示するときに使用します。
$price = 123.45;
printf('%f', $price);
実行結果は一般的に次のようになります。
123.450000
精度を指定しない場合、%fでは小数点以下が通常6桁で表示されます。
実際のプログラムでは、次のように小数点以下の桁数を指定するケースが多いでしょう。
printf('%.2f', 123.456);
結果は次のとおりです。
123.46
%bで2進数を表示する
%bは、整数を2進数で表示する書式指定子です。
printf('%b', 10);
結果は次のようになります。
1010
ビット演算や2進数の確認などで利用できます。
%oで8進数を表示する
%oを使用すると、整数を8進数として表示できます。
printf('%o', 10);
実行結果は次のとおりです。
12
%xで16進数を小文字表示する
%xは、整数を16進数へ変換し、小文字で表示します。
printf('%x', 255);
結果は次のとおりです。
ff
%Xで16進数を大文字表示する
%Xを使用すると、16進数を大文字で表示できます。
printf('%X', 255);
結果は次のとおりです。
FF
%eと%Eで指数表記する
%eと%Eは、数値を指数表記で表示するときに使用します。
例えば、次のように記述できます。
printf('%e', 12345.678);
%eでは小文字のe、%Eでは大文字のEを使用した指数表記になります。
非常に大きな数値や非常に小さな数値を扱う場合に便利です。
%cで文字を表示する
%cは、整数値に対応する文字を表示するときに使用できます。
例えば、次のコードでは65に対応する文字が表示されます。
printf('%c', 65);
結果は次のとおりです。
A
%%でパーセント記号を表示する
printf()では%が書式指定の開始を表すため、パーセント記号そのものを表示したい場合は%%と記述します。
$rate = 80;
printf('達成率は%d%%です。', $rate);
結果は次のとおりです。
達成率は80%です。
printfの主な書式指定子一覧
よく使用する書式指定子
代表的な書式指定子をまとめると、次のようになります。
| 書式指定子 | 内容 | 表示例 |
|---|---|---|
%s | 文字列 | PHP |
%d | 10進整数 | 123 |
%u | 符号なし10進数として表示 | 123 |
%b | 2進数 | 1111011 |
%o | 8進数 | 173 |
%x | 16進数・小文字 | 7b |
%X | 16進数・大文字 | 7B |
%f | 浮動小数点数 | 123.450000 |
%e | 指数表記・小文字 | 1.234500e+2 |
%E | 指数表記・大文字 | 1.234500E+2 |
%c | 整数に対応する文字 | A |
%% | %そのもの | % |
なお、%uは値を符号なし10進数として表現するための書式指定子です。
PHPの整数型そのものに、一般的なC言語のような独立したunsigned int型があるという意味ではない点には注意しましょう。
printfで小数点以下の桁数を指定する方法
%.2fを使って小数点以下2桁にする
printf()では、.数字を使って精度を指定できます。
例えば、次のコードでは小数点以下2桁まで表示します。
$number = 123.456789;
printf('%.2f', $number);
実行結果は次のとおりです。
123.46
小数点以下の桁数を変更したい場合は、数字部分を変更します。
printf('%.1f', 123.456);
printf('%.2f', 123.456);
printf('%.3f', 123.456);
それぞれ、小数点以下1桁、2桁、3桁で表示されます。
金額や割合、測定値などを一定の桁数で表示したい場合に便利です。
printfで整数をゼロ埋めする方法
%05dで5桁にゼロ埋めする
整数の前に0を追加して桁を揃えたい場合は、ゼロ埋めを指定できます。
printf('%05d', 123);
実行結果は次のとおりです。
00123
%05dは次の意味を持っています。
0:空いている部分を0で埋める
5:最小フィールド幅を5にする
d:整数として表示する
例えば、3桁でゼロ埋めしたい場合は次のようにします。
printf('%03d', 1);
結果は次のとおりです。
001
連番や管理番号、IDなどを決まった形式で表示するときに便利です。
指定する幅は固定文字数ではない
%05dの5は、厳密には「必ず5桁にする」という意味ではなく、「最小フィールド幅を5にする」という意味です。
そのため、値そのものが5桁を超えている場合でも切り捨てられることはありません。
printf('%05d', 123456);
結果は次のとおりです。
123456
指定した幅より値が長い場合は、そのまま表示されます。
printfで表示幅を指定する方法
%10sで右揃えする
表示幅を指定すると、文字列や数値を整列させることができます。
printf('|%10s|', 'PHP');
結果は次のようになります。
| PHP|
10は最小フィールド幅を表しています。
標準では、指定した幅の中で右寄せされます。
%-10sで左揃えする
左揃えにしたい場合は、-を指定します。
printf('|%-10s|', 'PHP');
結果は次のようになります。
|PHP |
CLIアプリケーションなどで表形式のデータを表示するときに便利です。
printfで正の数にもプラス記号を付ける方法
%+dを使用する
通常、正の整数を出力しても+は表示されません。
printf('%d', 10);
結果は次のとおりです。
10
正の数にも明示的にプラス記号を表示したい場合は、+フラグを使います。
printf('%+d', 10);
結果は次のようになります。
+10
負の数の場合は、通常どおりマイナス記号が表示されます。
printf('%+d', -10);
結果は次のとおりです。
-10
数値の増減を表示する処理などで利用できます。
printfで引数の順番を指定する方法
%1$sや%2$dを使用する
通常、printf()では書式指定子と値が左から順番に対応します。
printf('%sは%d歳です。', '田中', 30);
しかし、引数番号を指定すれば、使用する値の順番を明示できます。
printf('%1$sは%2$d歳です。', '田中', 30);
結果は次のとおりです。
田中は30歳です。
%1$sは1番目の値を文字列として表示し、%2$dは2番目の値を整数として表示します。
引数番号は1から始まる
引数番号を指定するときは、0ではなく1から始まります。
%1$s
%2$s
%3$s
配列などでは添字が0から始まることが多いため、混同しないよう注意しましょう。
同じ引数を複数回使用できる
引数番号を利用すると、一つの値をフォーマット文字列の中で繰り返し使用できます。
$language = 'PHP';
printf(
'%1$sはWeb開発で広く使われています。%1$sには多くの機能があります。',
$language
);
この方法なら、同じ値を何度も引数として渡す必要がありません。
PHP 8以降で幅や精度を動的に指定する方法
*を使って精度を引数から指定する
PHP 8以降では、*を利用して幅や精度を引数から指定する方法も利用できます。
例えば、次のコードでは小数点以下の桁数を引数として指定しています。
printf('%.*f', 3, 1.61803);
結果は次のとおりです。
1.618
通常の、
printf('%.3f', 1.61803);
と似ていますが、*を使えば精度を変数などから動的に変更できます。
表示桁数が状況によって変わるプログラムでは便利です。
printfを使って表形式で出力する方法
フィールド幅を揃えて表を作る
printf()の表示幅指定を利用すれば、CLIなどで簡単な表を作成できます。
printf("%-15s %10s\n", '商品名', '価格');
printf("%-15s %10d\n", 'Keyboard', 5000);
printf("%-15s %10d\n", 'Mouse', 3000);
printf("%-15s %10d\n", 'Monitor', 30000);
%-15sでは左揃えで最小15文字分の幅を確保し、%10dでは整数を右寄せして最小10文字分の幅を確保しています。
このような方法は、コマンドライン上で一覧表や集計結果を表示するときに役立ちます。
printfとechoの違い
echoは単純な文字列出力に向いている
PHPで文字列を出力する代表的な方法としてechoがあります。
$name = '田中';
$age = 30;
echo $name . 'は' . $age . '歳です。';
単純に文字列や変数を表示するだけであれば、echoは簡潔で使いやすい方法です。
printfは書式を細かく指定できる
同じ処理はprintf()でも記述できます。
printf('%sは%d歳です。', $name, $age);
特に、次のような処理ではprintf()が便利です。
printf('%.2f', $price);
printf('%05d', $id);
小数点以下の桁数やゼロ埋め、表示位置などを整えたい場合は、printf()のほうが適しています。
printfとsprintfの違い
printfは整形した結果を直接出力する
printf()は、整形した文字列をその場で出力します。
printf('価格:%.2f円', 123.456);
結果は次のとおりです。
価格:123.46円
sprintfは整形した文字列を返す
sprintf()は、整形した結果を直接表示せず、文字列として返します。
$message = sprintf('価格:%.2f円', 123.456);
echo $message;
そのため、生成した文字列を変数へ保存したい場合や、後からログやメールなどで利用したい場合はsprintf()が便利です。
例えば、ログメッセージを作成する場合は次のようにできます。
$message = sprintf(
'ユーザーID:%05d がログインしました。',
123
);
error_log($message);
すぐに画面へ出力する場合はprintf()、文字列として受け取って別の処理に利用する場合はsprintf()と考えると分かりやすいでしょう。
printfとnumber_formatの違い
number_formatは数値の桁区切りに便利
PHPには、数値を読みやすく整形するnumber_format()もあります。
echo number_format(1234567);
実行結果は次のとおりです。
1,234,567
小数点以下の桁数も指定できます。
echo number_format(1234567.89, 2);
結果は次のとおりです。
1,234,567.89
printfとnumber_formatを用途で使い分ける
number_format()は、主に数値の3桁区切りや小数部分を整える用途に向いています。
一方、printf()は文字列全体のフォーマットを自由に構成できます。
例えば、次のように考えると分かりやすいでしょう。
数値を3桁区切りにする
→ number_format()
複数の値を決められた書式で表示する
→ printf()
整形した結果を文字列として受け取る
→ sprintf()
用途に応じて使い分けることが大切です。
printfの戻り値
出力した文字列の長さが返される
printf()は出力を行うだけでなく、出力した文字列の長さを整数として返します。
例えば、次のように戻り値を変数へ格納できます。
$length = printf('Hello');
画面には、
Hello
と表示されます。
同時に、$lengthには出力された文字列の長さに相当する値が格納されます。
ただし、日本語などのマルチバイト文字を扱う場合は、人間が認識する文字数と単純に一致するとは限らないため注意が必要です。
printfを使う際の注意点
書式指定子と値の内容を合わせる
printf()を使うときは、値の種類に合った書式指定子を選ぶことが重要です。
基本的には次のように使い分けます。
文字列 → %s
整数 → %d
小数 → %f
適切でない書式指定子を使用すると、PHPによる型変換によって意図しない結果になることがあります。
%を表示するときは%%を使用する
パーセント記号を表示するときは、次のように%%を使用します。
printf('%d%%', 80);
結果は次のとおりです。
80%
%一つだけでは書式指定として解釈されるため注意しましょう。
日本語の幅指定には注意する
printf()で日本語などのマルチバイト文字列を整列させる場合は注意が必要です。
例えば、次のように指定しても、画面上で期待した幅にきれいに揃わない場合があります。
printf('%10s', 'こんにちは');
文字列のバイト数と画面上の表示幅、人間が認識する文字数は必ずしも同じではありません。
日本語や全角文字、絵文字などを正確に整列させたい場合は、マルチバイト文字や表示幅を考慮した別の処理が必要になることがあります。
printfが便利な場面
小数点以下の桁数を揃える
例えば、金額を小数点以下2桁で統一したい場合に利用できます。
printf('価格:%.2f円', 1980.5);
IDや連番をゼロ埋めする
管理番号を5桁で統一したい場合は次のように記述できます。
printf('商品ID:%05d', 123);
結果は次のようになります。
商品ID:00123
数値を2進数や16進数で表示する
プログラム内部の値を確認する用途でも便利です。
printf('%b', 10);
printf('%x', 255);
CLIでデータを整列させる
フィールド幅を指定できるため、コマンドラインツールで表や一覧を表示する用途にも適しています。
このようにprintf()は、「値を一定の形式に整えて表示したい」という場面で力を発揮します。
PHPのprintf関数についてのまとめ
printf()は、指定したフォーマットに従って文字列や数値を整形し、その結果を直接出力するPHPの関数です。
基本的な使い方は次のとおりです。
printf('名前:%s、年齢:%d歳', '田中', 30);
特によく使われる書式指定は次のようになります。
%s 文字列
%d 整数
%f 浮動小数点数
%.2f 小数点以下2桁
%05d 最小5桁でゼロ埋め
%b 2進数
%o 8進数
%x 16進数・小文字
%X 16進数・大文字
%% パーセント記号
単純な文字列を表示するだけならechoでも十分ですが、小数点以下の桁数や表示幅、ゼロ埋めなどを細かく指定したい場合はprintf()が便利です。
また、整形した結果を直接出力せず文字列として利用したい場合はsprintf()、数値を3桁区切りにしたい場合などはnumber_format()を使うと効率的です。
printf()の書式指定を理解しておくと、数値や文字列を読みやすく統一された形式で表示しやすくなります。
以上、PHPのprintf関数とは何か、書式や使い方についてでした。
最後までお読みいただき、ありがとうございました。










