先頭にゼロを付加して桁揃え。

例えば、月を表す数字(1, 2, 3, ..., 11, 12)を、先頭にゼロを付けて二桁に揃えたい("01", "02", "03", ..., "11", "12")。JavaScriptでは、どう書く?

「元の数字が 9 以下の場合は "0" を付加して…」或いは「元の文字列長が 1 の場合はゼロを…」というような場合分けをする必要はなくて、以下のようにすれば一発シンプルに解決。

元の数字の頭に "0" をくっつけて、後ろから二文字分を取り出す。

コードで書くと…

// 変数 month は 1 〜 12 の任意の数値
zeroPadded = ( "0" + month ).slice( -2 );

もう少し汎用性を持たせて、関数にしてしまいましょ。

function padding( s , d , p ){
  /* s : 元の文字列
     d : 揃えたい桁数
     p : 頭に付加する文字 */

  var pad = p.repeat( d - 1 );
  return ( pad + s ).slice( -d );
}

repeat() は未実装のブラウザが残っているので、その場合に備えておいたほうが安全です。前回の記事を参照してみてください。

この関数の動作確認。

for( m = 1; m <=12 ; m++ ){
  console.log( padding( m , 2 , '0' ) );
}
// コンソール出力は 01, 02, 03, ... , 11, 12

for( m = 1; m <=12 ; m++ ){
  console.log( padding( m , 3 , '*' ) );
}
// コンソール出力は **1, **2, **3, ... , *11, *12

引数が不正な場合(元の文字列やパディングする文字の長さが 0 だったり、桁数が 0以下だったりする場合など)の例外処理を組み込んでおくと、「あ、こいつ丁寧な仕事をしているな」と褒められます。

PHPで同様の処理をしたい場合には、文字列整形のために用意されている sprintf() を使えばよいのだけれど、この関数に渡す "フォーマット指示子" を覚えるのが億劫なので、JavaScriptでやったのと同じ方針で、

function padding( $s , $d , $p ){
  /* $s : 元の文字列
     $d : 揃えたい桁数
     $p : 頭に付加する文字 */

  $pad = str_repeat( $p , $d - 1 );
  return substr( $pad . $s , -$d );
}

と、こんな感じでいけるのではないかと。

このままだと、元の文字列や付加する文字がマルチバイトのときに結果がおかしくなるので注意してください。

カテゴリ: