LoginSignup
8
4

More than 5 years have passed since last update.

日本語・漢字を2byteとして換算してtruncateする

Posted at

Railsには、truncateというメソッドがある。
http://api.rubyonrails.org/classes/String.html#method-i-truncate

まぁ長い文字列を短縮してくれるメソッドなのは言わなくてもわかると思われるが、
半角英数字と日本語が混ざったりしていると、思ったところで短縮してくれなくて困る・・・・

"0001: 僕は新世界の神となる".truncate(10)
"なにがなんだかわからない・・・".truncate(10)
"fafafa!!! 無とは一体...".truncate(10)
=>
"01: 僕は新..."
"なにがなんだか..."
"fafafa!..."

そこで、マルチバイトを2byteとして換算して、truncateしてくれるメソッドを書いてみた。

class String

  # 全角文字を半角の2個分と扱ってtruncateを行う
  # truncate_atで指定された字数を超えない(切り捨て)
  #
  # @return [String] 短縮された文字列
  def my_truncate(truncate_at, options = {})
    omission = options[:omission] || '...'

    if size == bytesize
      truncate(truncate_at, options)
    else
      size.times do |i|
        str_size = (self[0..i].bytesize - self[0..i].size) / 2 + self[0..i].size
        next if str_size < (truncate_at - omission.size)

        return "#{ self[0..i] }#{ omission }" if str_size == (truncate_at - omission.size)
        return "#{ self[0..(i - 1)] }#{ omission }"
      end

      return self
    end
  end
end

実行してみる・・・

"01: 僕..."
"fafafa!..."
"なにが..."

いい感じ。
Railsなので、config/initializers/string_extension.rbとか作って、
書いておけば、Stringで実行できる

8
4
4

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
8
4