【PHP8.x】sprintf関数の使い方

sprintf関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

sprintf関数は、フォーマット文字列に基づいて文字列を生成する関数です。C言語の同名関数と同様の機能を提供し、変数や値を指定されたフォーマットに従って文字列に組み込むことができます。

この関数は、第一引数にフォーマット文字列を取り、その後ろにフォーマット文字列内のプレースホルダーに対応する引数を必要な数だけ受け取ります。フォーマット文字列は、リテラルな文字列と、パーセント記号(%)で始まるフォーマット指定子から構成されます。フォーマット指定子は、続く引数の型や表示形式を指示します。例えば、%sは文字列、%dは整数、%fは浮動小数点数をそれぞれフォーマットするために使用されます。

sprintf関数は、フォーマット文字列に基づいて生成された文字列を返します。引数の数がフォーマット文字列内のプレースホルダーの数と一致しない場合、エラーが発生する可能性があります。また、フォーマット指定子が引数の型と一致しない場合も、予期しない結果が生じる可能性があります。

システムエンジニアを目指す初心者の方にとって、sprintf関数は、ログ出力、ユーザーインターフェースへの表示、ファイルへの書き込みなど、様々な場面で役立つ便利なツールです。データの型に応じて適切なフォーマット指定子を使用することで、意図した形式で文字列を生成し、プログラムの可読性や保守性を向上させることができます。ただし、セキュリティ上の注意点として、ユーザーからの入力値を直接フォーマット文字列に含めることは、フォーマット文字列攻撃のリスクがあるため避けるべきです。代わりに、常に固定されたフォーマット文字列を使用し、ユーザー入力は引数として渡すようにしてください。

構文(syntax)

1sprintf ( string $format , mixed ...$values ) : string

引数(parameters)

string $format, mixed ...$values

  • string $format: フォーマット文字列。出力の形式を指定します。
  • mixed ...$values: フォーマット文字列で指定されたプレースホルダーに対応する値。

戻り値(return)

string

指定されたフォーマット文字列と引数に基づいて、フォーマットされた文字列を返します。

サンプルコード

PHP sprintfで数値の0埋めを行う

1<?php
2
3/**
4 * sprintf 関数を使って数値を0埋めするサンプル
5 *
6 * @param int $number 対象の数値
7 * @param int $length 桁数
8 * @return string 0埋めされた文字列
9 */
10function zeroPadding(int $number, int $length): string
11{
12    // sprintf関数で0埋めを行う
13    return sprintf("%0{$length}d", $number);
14}
15
16// 使用例
17$number = 123;
18$length = 5;
19$zeroPaddedNumber = zeroPadding($number, $length);
20
21// 結果を出力
22echo $zeroPaddedNumber . PHP_EOL; // "00123" が出力される

PHPのsprintf関数は、指定されたフォーマット文字列に基づいて文字列を生成する関数です。この関数を利用することで、数値の0埋めを簡単に行うことができます。

上記のサンプルコードでは、zeroPaddingという関数を定義しています。この関数は、0埋めしたい数値$numberと、桁数$lengthを引数として受け取ります。

sprintf("%0{$length}d", $number)という部分が、実際に0埋めを行っている箇所です。%0{$length}dは、sprintf関数におけるフォーマット指定子であり、%dは整数を表し、0は0埋めを行うことを、{$length}は桁数を指定することを意味します。sprintf関数は、このフォーマット指定子に従って、$numberを0埋めした文字列に変換します。

例えば、$numberが123で$lengthが5の場合、sprintf関数は%05dというフォーマットで123を処理します。結果として、"00123"という文字列が生成され、zeroPadding関数の戻り値として返されます。

このサンプルコードでは、zeroPadding関数を呼び出し、結果をechoで出力しています。これにより、画面に"00123"という0埋めされた数値が表示されます。sprintf関数を使うことで、桁数を意識した文字列整形を柔軟に行うことができます。

sprintf関数で0埋めを行う際、$format引数に指定する書式指定文字列を正しく記述する必要があります。%0{$length}d は、「0で埋め、全体の桁数が$lengthになるように、整数$numberをフォーマットする」という意味です。$lengthは変数なので、{}で囲む必要があります。

また、sprintf関数は、フォーマット文字列と引数の型が一致しない場合、予期せぬ結果になる可能性があります。特に、$values引数には、フォーマット文字列に対応した適切な型の値を渡すように注意してください。今回の例では、%d は整数を期待しているので、$numberが整数であることを確認しましょう。is_int()などで事前にチェックすると安全です。

PHP sprintfで小数点桁数を指定する

1<?php
2
3/**
4 * sprintf関数を使って、小数点以下の桁数を指定して数値を文字列にフォーマットする例。
5 */
6function formatDecimal(float $number, int $precision): string
7{
8    // %に続くfは浮動小数点数を意味し、.[桁数]で小数点以下の桁数を指定。
9    $formattedString = sprintf("%.{$precision}f", $number);
10    return $formattedString;
11}
12
13// 例: 円周率を小数点以下2桁でフォーマット
14$pi = 3.14159265359;
15$formattedPi = formatDecimal($pi, 2);
16echo "円周率: " . $formattedPi . PHP_EOL; // 出力: 円周率: 3.14
17
18// 例: 価格を小数点以下0桁でフォーマット
19$price = 99.99;
20$formattedPrice = formatDecimal($price, 0);
21echo "価格: " . $formattedPrice . PHP_EOL; // 出力: 価格: 100

sprintf関数は、指定されたフォーマット文字列に基づいて文字列を生成する関数です。引数には、フォーマット文字列 $format と、それに埋め込む値 $values を指定します。フォーマット文字列には、プレースホルダと呼ばれる特殊な記号が含まれており、$values の値が対応するプレースホルダに置き換えられます。

このサンプルコードでは、sprintf関数を使って浮動小数点数を指定した桁数でフォーマットする方法を示しています。formatDecimal関数は、浮動小数点数 $number と小数点以下の桁数 $precision を受け取り、sprintf関数を使ってフォーマットされた文字列を返します。

フォーマット文字列 %.{$precision}f は、浮動小数点数をフォーマットするためのものです。% はプレースホルダの開始を示し、f は浮動小数点数であることを意味します。.{$precision} は小数点以下の桁数を指定する部分で、{$precision} の部分には、引数で渡された $precision の値が展開されます。例えば、$precision2 の場合、フォーマット文字列は %.2f となり、小数点以下2桁でフォーマットされます。

サンプルコードでは、円周率と価格をそれぞれ異なる桁数でフォーマットし、結果を出力しています。sprintf関数を使うことで、数値の表示形式を柔軟に制御できます。sprintf関数は文字列を返し、フォーマットに失敗した場合はNULLを返します。

sprintf関数で小数点以下の桁数を指定する際は、%.[桁数]f のように記述します。[桁数]には表示したい小数点以下の桁数を指定してください。 f は浮動小数点数を意味します。 桁数を0にすると、小数点以下は切り捨てではなく、四捨五入されますのでご注意ください。 また、format引数に渡す変数の型が想定と異なる場合、予期せぬ結果になる可能性があります。引数の型を意識して使用しましょう。 Sprintf関数は文字列を返すため、数値として扱いたい場合は、キャストが必要となる場合があります。 セキュリティの観点から、ユーザーからの入力を直接sprintfのformat引数に含めるのは避けてください。フォーマット文字列を外部から制御できると、意図しない情報漏洩やエラーが発生する可能性があります。

関連コンテンツ

【PHP8.x】sprintf関数の使い方 | いっしー@Webエンジニア