【PHP】0(ゼロ)で桁数を揃えたり文字詰めを行う方法

公開日:
更新日:
カテゴリー: PHP

PHPで文字列を扱うときやファイルの保存名を決めるときに0(ゼロ)詰めして数字の桁を揃えたり、文字を詰めたりしたい場合があります。

ここではその方法を説明したいと思います。

str_pad関数

str_pad関数を使えばゼロ詰めや文字詰めで桁数などを簡単に揃えることができます。

str_pad(第1引数, 第2引数, 第3引数, 第4引数);

この関数は文字列を固定長の他の文字列で埋めることができ、

  1. 第1引数で指定した文字列の右側 or 左側 or 両側を第3引数で指定した文字列で埋めることが出来ます
  2. 何個埋めるか?は第2引数で決めることができます
  3. 第1引数で指定した文字列の右側 or 左側 or 両側のどちらを埋めるかは第4引数で指定します

言葉だけの説明だとわかりづらいので、実際にサンプルプログラムを見てみましょう。

右側にゼロを詰めて桁数を揃える

次のような5つの桁数が異なる数字があった場合、str_pad関数を使えば任意の桁数に揃えることができます(例として4桁に揃える)。

<?
//数字
$number_a = 123;
$number_b = 32;
$number_c= 9;
$number_d = 5678;
$number_e = 12378;

//左側をゼロで詰めて4桁の数字列にする
echo str_pad($number_a, 4, 0, STR_PAD_RIGHT);
echo str_pad($number_b, 4, 0, STR_PAD_RIGHT);
echo str_pad($number_c, 4, 0, STR_PAD_RIGHT);
echo str_pad($number_d, 4, 0, STR_PAD_RIGHT);
echo str_pad($number_e, 4, 0, STR_PAD_RIGHT);
?>

これを実行すると次のようになります。

1230
3200
9000
5678
12378 ←最初から第2引数で指定した桁数より大きいので変化なし

※第4引数の「STR_PAD_RIGHT」は右詰めを指定するオプション

左側をゼロで埋める

左側をゼロで埋めたい場合は、第4引数を「STR_PAD_LEFT」にします。

<?
//数字
$number_a = 123;
$number_b = 32;
$number_c= 9;
$number_d = 5678;
$number_e = 12378;

//左側をゼロで埋めて4桁の数字列にする
echo str_pad($number_a, 4, 0, STR_PAD_LEFT);
echo str_pad($number_b, 4, 0, STR_PAD_LEFT);
echo str_pad($number_c, 4, 0, STR_PAD_LEFT);
echo str_pad($number_d, 4, 0, STR_PAD_LEFT);
echo str_pad($number_e, 4, 0, STR_PAD_LEFT);
?>

これを実行すると次のようになります。

0123
0032
0009
5678
12378 ←最初から第2引数で指定した桁数より大きいので変化なし

任意の文字で埋める

数字だけでなく、文字の場合も有効です。

<?
//文字列
$string_a = "aoc";
$string_b= "jp";
$string_c = "hklasddfgdf";
$string_d = "";

//右側を「x」で埋めて7文字の文字列にする
echo str_pad($string_a, 7, "x",  STR_PAD_RIGHT);
echo str_pad($string_b, 7, "x",  STR_PAD_RIGHT);
echo str_pad($string_c, 7, "x",  STR_PAD_RIGHT);
echo str_pad($string_d, 7, "x",  STR_PAD_RIGHT);
?>

これを実行すると次のようになります。

aocxxxx
jpxxxxx
hklasddfgdf ←最初から第2引数で指定した文字数より多いので変化なし
xxxxxxx   ←すべて「x」で7文字分右側から埋められる

第3引数に文字列を指定する

str_pad関数の第3引数は文字や数字だけでなく文字列も指定できます。

<?
//文字列
$number_a = 123;
$number_b = 9;
$number_c = 12378;

//左側に「sample-」を付与して10文字の文字列にする
echo str_pad($number_a, 10, "sample-",  STR_PAD_LEFT);
echo str_pad($number_b, 10, "sample-",  STR_PAD_LEFT);
echo str_pad($number_c, 10, "sample-",  STR_PAD_LEFT);
?>

これを実行すると次のようになります。

sample-123
sample-sa9  ←第2引数で指定した文字数を埋めるために繰り返される
sampl12378 ←第2引数で指定した文字列を超える場合途中で途切れる

第4引数に「STR_PAD_BOTH」を指定

第4引数に「STR_PAD_BOTH」を指定すると、両側詰めとなります。

<?
//数字
$string = "aaa";

//両側を「x」で埋めて10文字の文字列にする
echo str_pad($string, 10, "x",  STR_PAD_BOTH);
?>

これを実行すると次のようになります。

xxxaaaxxxx

「なぜ右側が4つ?左側が4つにならない理由は?」と考えましたが、何度か検証した結果

  1. 最初に右に「x」を一つ埋める
  2. 次に左側に「x」をひとつ埋める
  3. 以下略

というように、右側から埋め作業に入るからだと思います。

sprintf関数

今回はstr_pad関数でのゼロ詰めや文字詰めの方法を説明しましたが、sprintf関数でも同様なことができます。

例えば、左側にゼロを詰めて5桁の数字列にする場合は次のようにします。

<?
//数字
$number = "345";

//左側を「0」で埋めて5桁の数字列にする
echo sprintf("%05d", $number);
?>

00345

私は直感的に使えるのでゼロ詰めなどはstr_pad関数を使っていますが、速度的にはsprintf関数の方が早いそうです。

 

あわせて読んでほしい!

 

コメント

まだコメントはありません。

コメントフォーム
お名前
コメント