こんにちは、鈴木です。
Ruby の String クラスには、ljust, rjust, center というメソッドがあります。
ひょんなことなら、ljust などのメソッドを使う機会がありました(家計簿集計スクリプトを書いただけですが(^^;)。
ljust, rjust, center
ljust, rjust, center は指定した文字数になるようにパディングするメソッドです。
言葉で説明するよりも実行例を見ていただいた方が分かりやすいかと思いますので、以下のコードを見てください。
1 2 3 |
'123'.ljust(10, '*') '123456'.ljust(10, '*') '123456789'.ljust(10, '*') |
出力は以下の通りです。
要するにテキスト出力する時に、横幅を綺麗に揃えたい場合に使用するメソッドです。
ljust は左揃え、rjust は右揃え、center は中央揃えです。
以下の実行例を見てください。
1 2 3 |
'123'.rjust(10, '*') '123'.center(10, '*') '123'.ljust(10, '*') |
出力は次の通りです。
マルチバイト文字を含む場合
マルチバイト文字を含む場合は、綺麗に横幅が揃わないです。
1 2 3 |
puts 'ルパン3世'.ljust(15, '*') puts '鉄人28号'.ljust(15, '*') puts 'マジンガーZ'.ljust(15, '*') |
出力を見ると、以下のようにガタガタになってしまいました。
ということで、以下のようなメソッドを書いてみました。
1 2 3 4 5 6 7 8 9 |
class String def mb_ljust(width, padding=' ') output_width = each_char.map{|c| c.bytesize == 1 ? 1 : 2}.reduce(0, &:+) padding_size = [0, width - output_width].max self + padding * padding_size end end |
マルチバイト文字に対応した ljust ということで、mb_ljust という名前のメソッドを定義しています。
処理内容としては、文字ごとに見ていき、マルチバイト文字なら横幅 2、それ以外は横幅 1 として、表示される時の幅を求めます(output_width)。
そしてパディングのサイズを求めます(padding_size)。
そして、最後にパディングした文字列を返しています。
※引数の padding にマルチバイト文字を渡されるケースはサポート外ですのであしからず(^^;
それでは定義した mb_ljust を使用してみます。
1 2 3 |
puts 'ルパン3世'.mb_ljust(15, '*') puts '鉄人28号'.mb_ljust(15, '*') puts 'マジンガーZ'.mb_ljust(15, '*') |
結果は以下の通り、綺麗に横幅が揃いました。
※当然ながら等幅フォントで表示することを前提としています。