[Ruby] 全角文字を2文字として文字数をカウントする

非アスキー文字を2文字とカウントする。

知らなかったメソッドもあって勉強になりました。

[3] pry(main)> def width
[3] pry(main)*   self.length + self.chars.reject(&:ascii_only?).length
[3] pry(main)* end
=> :width
[4] pry(main)> 'hogeふが'.width
=> 8

String#chars

文字列の各文字を文字列の配列で返します。(self.each_char.to_a と同じです)

[8] pry(main)> 'hogeふが'.chars
=> ["h", "o", "g", "e", "ふ", "が"]

String#ascii_only?

文字列がASCII文字のみで構成されている場合に true を返します。さもなくば false を返します。

[9] pry(main)> 'hogeふが'.ascii_only?
=> false
[10] pry(main)> 'hoge'.ascii_only?
=> true
[11] pry(main)> 'ふが'.ascii_only?
=> false

Enumerable#inject

リストのたたみこみ演算を行います。

[5] pry(main)> [1, 2, 3, 4, 5].inject(:+)
=> 15
[21] pry(main)> ["h", "o", "g", "e", "ふ", "が"].reject {|item| item.ascii_only? }
=> ["ふ", "が"]