「先頭ゼロ埋め」で何をしたいのか
先頭ゼロ埋めは、一言でいうと「数字や文字列を、決めた桁数になるように左側を 0 で埋める」ことです。
社員番号を 000123 のように 6 桁でそろえたい。
請求書番号を INV-000045 のように見た目を整えたい。
日付や時刻の「月」「日」「時」「分」を 2 桁でそろえたい(03, 09 など)。
こういう「桁数をそろえたい」「見た目をきれいにしたい」場面で、先頭ゼロ埋めはよく使われます。
PHP での基本:str_pad と sprintf の二本柱
str_pad を使ったゼロ埋め
一番ストレートなのが str_pad() です。
$id = 123;
// 6 桁になるように左側を '0' で埋める
$zeroFilled = str_pad((string)$id, 6, '0', STR_PAD_LEFT);
echo $zeroFilled; // 000123
PHPここで大事なのは、第二引数と第四引数です。
第二引数:最終的に何桁(何文字)にしたいか。
第四引数:左側を埋めるのか(STR_PAD_LEFT)、右側か、両側か。
先頭ゼロ埋めでは、基本的に STR_PAD_LEFT 一択です。
数字を渡すときは、念のため (string)$id のように文字列にキャストしておくと安心です。
sprintf を使ったゼロ埋め
もう一つよく使うのが sprintf() です。
フォーマット文字列で「何桁・ゼロ埋め」をまとめて指定できます。
$id = 123;
// %06d = 「6 桁の整数、足りない分は 0 で左埋め」
$zeroFilled = sprintf('%06d', $id);
echo $zeroFilled; // 000123
PHP%06d の意味はこうです。
% … フォーマット指定の開始。0 … 足りない桁を 0 で埋める。6 … 全体を 6 桁にする。d … 整数として扱う。
数字のゼロ埋めだけなら、sprintf() のほうが短くて読みやすいことが多いです。
例題① 社員番号を 6 桁でそろえる
要件のイメージ
社員番号は内部的には整数(1, 2, 3, …)で管理しているが、
画面や帳票では 000001, 000002 のように 6 桁で表示したい、というケースです。
実装例(sprintf 版)
function format_employee_no(int $id): string
{
return sprintf('%06d', $id);
}
echo format_employee_no(1); // 000001
echo format_employee_no(123); // 000123
PHPここでのポイントは、「戻り値は文字列」と決めていることです。
見た目を整えた瞬間に、それは“数値”というより“表示用の文字列”になります。
例題② プレフィックス付きの連番を作る
要件のイメージ
請求書番号を INV-000045 のようにしたい。
プレフィックス(INV-)+ゼロ埋めした連番、というパターンです。
実装例
function format_invoice_no(int $seq): string
{
$number = sprintf('%06d', $seq);
return 'INV-' . $number;
}
echo format_invoice_no(45); // INV-000045
PHPstr_pad() で書くならこうです。
function format_invoice_no(int $seq): string
{
$number = str_pad((string)$seq, 6, '0', STR_PAD_LEFT);
return 'INV-' . $number;
}
PHPどちらでも結果は同じですが、「整数をゼロ埋めする」という意味が一目で分かるぶん、sprintf('%06d', …) のほうが好まれることが多いです。
例題③ 日付・時刻の 2 桁ゼロ埋め
要件のイメージ
2025-2-3 7:5 のような値を、2025-02-03 07:05 のように整形したい、というケースです。
実装例
$year = 2025;
$month = 2;
$day = 3;
$hour = 7;
$min = 5;
$formatted = sprintf(
'%04d-%02d-%02d %02d:%02d',
$year,
$month,
$day,
$hour,
$min
);
echo $formatted; // 2025-02-03 07:05
PHPここでは %04d(4 桁ゼロ埋め)、%02d(2 桁ゼロ埋め)を組み合わせています。
日付・時刻のフォーマットは DateTime や date() でもできますが、
「単純に数字をゼロ埋めしたい」だけなら sprintf() で十分です。
どちらを使うべきかの目安
str_pad が向いている場面
文字列として扱いたい値(コード、ID、任意の文字列)を、
「左側を 0 で埋めて長さをそろえたい」だけのとき。
$code = '7A';
echo str_pad($code, 4, '0', STR_PAD_LEFT); // 007A
PHP数字とは限らないもの(英数字混在など)には str_pad() が素直です。
sprintf が向いている場面
「整数をゼロ埋めして表示したい」場面全般。
複数の数値を一気にフォーマットしたいとき(日時など)。
$id = 123;
$page = 5;
echo sprintf('ID:%06d / PAGE:%03d', $id, $page);
// ID:000123 / PAGE:005
PHP「何桁の整数か」がフォーマット文字列に明示されるので、
後からコードを読むときにも意図が伝わりやすいです。
まとめ:今日からの「先頭ゼロ埋め」ユーティリティ
先頭ゼロ埋めの本質は、「内部では数値や短い文字列として扱いつつ、表示や出力のときだけ桁数をそろえる」ことです。
数字メインなら sprintf('%0Nd', $value)。
文字列も含むなら str_pad((string)$value, N, '0', STR_PAD_LEFT)。
実務ユーティリティとしては、例えばこんな関数を 1 本用意しておくと使い回しやすくなります。
function zero_pad_int(int $value, int $width): string
{
return sprintf('%0' . $width . 'd', $value);
}
PHPecho zero_pad_int(7, 3); // 007
echo zero_pad_int(123, 6); // 000123
PHPもし、あなたのコードの中で「'000' . $id のように手書きでゼロを足している」箇所があれば、そこがこのユーティリティに置き換えるべきポイントです。
「何桁にしたいか」を数字で指定できるようにしておくと、仕様変更にも強いコードになります。
