当您要截断超过特定字符长度的文本时,Rails会提供truncate
方法。这是here提供的示例:
truncate("Once upon a time in a world far far away")
# => "Once upon a time in a world..."
它会在给定的文本之后截断给定的文本:length如果文本长于:length
但我有以下例子:
str = "abcdefhijklmno"
在12个字符之后我希望它被截断,所以上面的文字应该是这样的:
abcdefhijklm...
但是我尝试使用truncate方法并且无法获得所需的结果:
> str = "abcdefhijklmno"
=> "abcdefhijklmno"
> str.truncate(15)
=> "abcdefhijklmno"
> str.truncate(14)
=> "abcdefhijklmno"
> str.truncate(13)
=> "abcdefhijk..."
> str.truncate(12)
=> "abcdefhij..."
我认为truncate(12)
会这样做,但会在9个字符后截断。我做错了什么?
答案 0 :(得分:2)
truncate
的参数表示输出字符串的大小(使用" ..."):
str.truncate(13)
=> "abcdefhijk..."
str.truncate(13).size
=> 13
如果需要,您可以按空格更改默认省略(...
):
str.truncate(13, omission: '')
=> "abcdefhijklmn"
有关Rails的更多信息String#truncate
here。
答案 1 :(得分:1)
我不相信str.truncate
会做你想要的开箱即用。但由于它只是一个额外的if
语句,因此很容易编写:
def trunc(str, length)
addition = str.length > length ? '...' : ''
"#{str.truncate(length, omission: '')}#{addition}"
end
或稍微简化,没有Rails依赖(如评论中Ilya所述):
def trunc(str, len)
"#{str.first(len)}#{'...' if str.size > len}"
end
测试案例:
2.2.1 :005 > s = 'abcdefghijklmno'
=> "abcdefghijklmno"
2.2.1 :006 > trunc(s, 20)
=> "abcdefghijklmno"
2.2.1 :007 > trunc(s, 15)
=> "abcdefghijklmno"
2.2.1 :008 > trunc(s, 14)
=> "abcdefghijklmn..."
2.2.1 :009 > trunc(s, 13)
=> "abcdefghijklm..."
2.2.1 :010 > trunc(s, 0)
=> "..."
2.2.1 :011 > trunc(s, 1)
=> "a..."