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で実行できる