13
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[PHP] ゼロ埋め、スペース埋めとマルチバイト

Posted at

文字列を空白で埋める

固定長の文字列を得るために、後ろをスペースで埋めたり数値を右揃えで頭をゼロで埋めたりしたい場面はあると思います。
PHPでは以下の関数を使うのがセオリーですが…

str_pad — 文字列を固定長の他の文字列で埋める

str_pad
$str1 = 'hogehoge';
$str2 = 'piyo';
//10桁で後ろをスペースで埋める
echo str_pad($str1, 10); //'hogehoge  '
echo str_pad($str2, 10); //'piyo      '

sprintf — フォーマットされた文字列を返す

sprintf
$str1 = 'hogehoge';
$str2 = 'piyo';
//10桁で後ろをスペースで埋める
echo sprintf("%-10s", $str1); //'hogehoge  '
echo sprintf("%-10s", $str2); //'piyo      '

マルチバイト文字の場合

全角はもちろん、半角カナもマルチバイトなので(ちょっとハマりました…)上記の記述だと意図した結果が得られません。

マルチバイト
$str1 = 'ホゲホゲ';
$str2 = 'ピヨ';
//10桁で後ろをスペースで埋められない・・・
echo str_pad($str1, 10); //'ホゲホゲ'
echo str_pad($str2, 10); //'ピヨ '
echo sprintf("%-10s", $str1); //'ホゲホゲ'
echo sprintf("%-10s", $str2); //'ピヨ '

対応するmb_シリーズの関数もないようで、どうしようかと思っていたらマニュアルのコメントに素晴らしい解決策がありました。

function mb_str_pad ($input, $pad_length, $pad_string=" ", $pad_style=STR_PAD_RIGHT, $encoding="UTF-8") {
    $mb_pad_length = strlen($input) - mb_strlen($input, $encoding) + $pad_length;
    return str_pad($input, $mb_pad_length, $pad_string, $pad_style);
}
マルチバイト改
$str1 = 'ホゲホゲ';
$str2 = 'ピヨ';
//10桁で後ろをスペースで埋められた
echo mb_str_pad($str1, 10); //'ホゲホゲ    '
echo mb_str_pad($str2, 10); //'ピヨ       '

「文字数」カウントなので、全角文字を引数にする場合はどういう結果を得たいかによって少し手を加える必要がありますね。

13
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?