我很惊讶,没有一个答案是正确的真(或使用轨道帮手限制),虽然这是很老的问题,所以这里是解决方案。
让我们清楚地阐述它的目标是什么。我们希望将字符串s
截断为30个字符,并且如果它不能完全适合,我们也会删除最后一个单词。我们还希望从结果中截断尾随空格,并添加省略号(如果缩短文本)。
如果文本长度超过限制,超过的缩短是那么容易,因为
s[0,s.rindex(/\s/,30)].rstrip + '...'
如果我们想将整个结果是最多30个字符,比它是从减去椭圆形的长度一样简单30.所以,因为我们用三个点(而不是一个三个点字符),比我们需要
s[0,s.rindex(/\s/,27)].rstrip + '...'
而最终的结果(与测试中,我们是否需要在所有截断)是:
if s.length<=30
s
else
s[0,s.rindex(/\s/,27)].rstrip + '...'
end
就是这样。
注:有一些阴暗的情况下,当期望的结果并不明显。在这里,他们是:
- 如果字符串有很多的空间(
s= "Helo word "
)结束,但比30应该较短的空间会保留吗? - 目前他们是。
- 与上面相同,但末尾的空格跨越限制o 30.与(
s= "Twentyseven chars long text "
)类似 - 当前所有空格和结尾都被截断并添加了省略号。
感谢您的纯红宝石答案!完美工作。 – 2012-02-29 17:28:30
这不是大多数人想要的。无论字符串是否超过30个字符,它都会添加省略号。 – gamut 2016-03-29 13:12:22
此外,这个答案没有理由抛出最后一个词,即使它没有必要。不要成为字符串“这是一些文本,它真的......”是更有预期的结果吗? – gorn 2016-10-06 20:39:44