2011/06/08

指定文字数での切り捨て

大量の文字出力があるコマンドラインアプリを作りました。その中の数行の出力結果が非常に長い場合、結果が見にくくてしょうがない問題に襲われました。
そこで、指定文字数だけ出力して残りを切り捨てるsnippetを追加。split(//)で1文字ずつhitさせるのが、multi-byte文字を扱うときの定石らしいですね。なんとなく実装しましたが、もっとうまい方法ないかなぁ...

def truncate(string, width)
  if string.length <= width
    string
  else
    abbr_symbol = "..."
    string = string[0, width - abbr_symbol.length]
    # Even if string consisted multi-byte characters,                                            
    # number_of_character would work well.                                                       
    number_of_character = string.split(//).size
    # Last character may be broken.                                                              
    string = string.split(//)[0, number_of_character-1].join

    (string || "") + abbr_symbol
  end
end

2011/06/23追記:
こういうときはjustified(揃える)という英単語を使うらしい。この場合だとleft_justifiedか。適切な名前がすぐに思いつくようになりたいなぁ...orz

2011/07/01追記:
String.ljustでもっと簡単に実装できる気がしてきました...。