PHP Tips | 文字列処理:実務向け便利系 - 先頭ゼロ埋め

PHP PHP
スポンサーリンク

「先頭ゼロ埋め」で何をしたいのか

先頭ゼロ埋めは、一言でいうと「数字や文字列を、決めた桁数になるように左側を 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
PHP

str_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 桁ゼロ埋め)を組み合わせています。
日付・時刻のフォーマットは DateTimedate() でもできますが、
「単純に数字をゼロ埋めしたい」だけなら 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);
}
PHP
echo zero_pad_int(7, 3);   // 007
echo zero_pad_int(123, 6); // 000123
PHP

もし、あなたのコードの中で「'000' . $id のように手書きでゼロを足している」箇所があれば、そこがこのユーティリティに置き換えるべきポイントです。
「何桁にしたいか」を数字で指定できるようにしておくと、仕様変更にも強いコードになります。

タイトルとURLをコピーしました