Kintarou'sBlog

プログラミング学習中。学習内容のアウトプットや読書で学んだことなど随時投稿!

【PHP】sprintf() printf()について

こんにちは😊Kintarouです。

現在エンジニア転職を目指してTECH CAMPにてプログラミング学習中です👨‍🎓
夢はフリーランスエンジニアになって働く人が働きやすいシステムを作ること!
と、愛する妻と海外移住すること🗽

プログラミングや読んでいる本のことなど、ブログに書いていきます!
twitter : https://twitter.com/ryosuke_angry


今日からビルトイン関数の学習に入ります!rubyで言うところのメソッドに近いのかなと思っています。
今回参考にさせて頂いたサイト様🙇‍♂️ dotinstall.com www.php.net


sprintf(), printf()

引数を渡してフォーマットしてから出力するといった場合に使えるそうです。

<?php

$name = 'Kintarou';
$score= 42.195;

#今回[ ] - [ ]に$nameと$scoreを表示し、[ ]内の文字数は10に統一します。  
#引数が10に満たない場合は桁数分空白にします。  
#$scoreは浮動小数ですが、小数点以下2桁までを四捨五入して表示します。

$info = sprintf("[%10s] - [%10.2f]", $name, $score);
echo $info . PHP_EOL;

#=> [  Kintarou] - [     42.20]

最初に""で囲ってフォーマットを指定しています。("[%10s] - [%10.2f]"の部分)

指定子

引数(今回の場合$name, $score)をどういう型で扱うかを指定できます。
今回[ ]の中に引数の値が表示されていましたが、フォーマットの中にある%10sや%10.2fがそれにあたります。
もう少し正確に言うとそれぞれの%s(文字列)、%f(浮動小数値)が指定子にあたります。
間にある10や10.2はWidthと呼ばれるものです。

Width

(最小で)何文字が変換結果に含まれるかを数値で指定します。 今回はそれぞれ10とあるので10桁となり、満たない場合デフォルトでは左側に半角スペースが入ります。
%fは10ではなく10.2ですが、小数点を扱うf等の指定子の場合.2とすることで小数点以下の桁数を指定できます。10と.2は切り離して考える必要があります。

フォーマットのデフォルトを操作する

今回はデフォルトの状態で、Widthに満たない桁数分左側に半角スペースを埋めて表示されましたが設定を変更する事ができます。

フラグ 説明
- 与えられたフィールドの幅を左寄せにします。 右寄せがデフォルトです。
+ 正の数値の前に付ける + 符号です; デフォルトは、負の数にだけマイナスの符号が数値の前に付きます。
(space) スペースに変換される詰め物です。 これがデフォルトです。
0 数値の左側を0埋めします。 s 指定子を使うと、 右側にも0埋めできます。
'(char) 指定された (char) で埋めます。
<?php

$name = 'Kintarou';
$score= 42.195;
$medal= 'Gold';

#今回は$nameに'(char)、$scoreに0、$medalに-のフラグを設定してみます。

$info = sprintf("[%'K10s] - [%010.2f] - [%-10s]", $name, $score, $medal);
echo $info . PHP_EOL;

#=> [KKKintarou] - [0000042.20] - [Gold      ]

printf , sprintfの違い

上記では全てsprintfで動作させましたが、printfでも同じ動作が出来ます。
どういう違いかというと、sprintfはフォーマットした内容を文字列として戻り値にし
printfはフォーマットした内容を出力もしますが、文字数を戻り値とします。

なので以下のように出力するとprintfには文字数が返ってきていることがわかります。

<?php


$name = 'Kintarou';
$score= 42.195;
$medal= 'Gold';

$info = sprintf("[%'K10s] - [%010.2f] - [%-10s]", $name, $score, $medal);

echo $info . PHP_EOL;

$info = printf("[%'K10s] - [%010.2f] - [%-10s]", $name, $score, $medal);

echo $info . PHP_EOL;

#=> [KKKintarou] - [0000042.20] - [Gold      ]
#=> [KKKintarou] - [0000042.20] - [Gold      ]42

以上、どなたかの参考になれば幸いです😊