我的Ruby模型中有以下方法:
旧:
def to_s
numbers = self.title.scan(/\d+/) if self.title.scan(/\d+/)
return numbers.join.insert(0, "#{self.title.chop} ") if numbers
"#{self.title.titlecase}"
end
新:
def to_s
numbers = self.title.scan(/\d+/)
return numbers.join.insert(0, "#{self.title.sub(/\d+/, '')} ") if numbers.any?
self.title.titlecase
end
title
可以是这样的:Level1或TrackStar
所以TrackStar应该成为Track Star,而Level1应该是Level 1,这就是我开始扫描数字的原因
我试图将其显示为第1级。上述工作,我只是想知道是否有更有说服力的解决方案
答案 0 :(得分:4)
试试这个:
def to_s
self.title.split(/(?=[0-9])/, 2).join(" ")
end
split
的第二个参数是确保“Level10”之类的标题不会转换为“Level 1 0”。
修改 - 在字词之间添加空格,我会使用gsub
:
def to_s
self.title.gsub(/([a-z])([A-Z])/, '\1 \2').split(/(?=\d)/, 2).join(" ")
end
请确保在gsub
的第二个参数中使用单引号。
答案 1 :(得分:1)
这个怎么样:
'Level1'.split(/(\d+)/).join(' ')
#=> "Level 1"