【问题标题】:truncate text after exceeding certain size超过一定大小后截断文本
【发布时间】:2016-06-01 18:06:37
【问题描述】:

当您想要截断超过特定字符长度的文本时,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 个字符后截断。我做错了什么?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    truncate 的参数表示输出字符串的大小(带有“...”):

    str.truncate(13)
    => "abcdefhijk..."
    str.truncate(13).size
    => 13
    

    如果需要,您可以通过空格更改默认省略(...):

    str.truncate(13, omission: '')
    => "abcdefhijklmn"
    

    更多关于 Rails 的信息String#truncatehere

    【讨论】:

    • 我想要的是:“abcdefhijklm...” 我想保留 12 个字符并添加 3 个点。那将是总共 15 个字符。使用 15 is 参数仍然没有给出预期的结果:str.truncate(15) => "abcdefhijklmno"
    • @Donato,这是很奇怪的行为,因为你的字符串不需要截断,它已经满了。如果需要,只需添加...str.size > 15 ? "#{str}..." : str.truncate(15)
    • @Donato 或者您可以编写自己的方法,例如:"12334554".first(3) + "..."
    【解决方案2】:

    我不相信str.truncate 会开箱即用地做你想做的事。但由于它实际上只是一个额外的if 语句,因此很容易编写:

    def trunc(str, length)
      addition = str.length > length ? '...' : ''
      "#{str.truncate(length, omission: '')}#{addition}"
    end
    

    或者稍微简化,并且没有 Rails 依赖(正如 Ilya 在 cmets 中提到的那样):

    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..."
    

    【讨论】:

    • 可以简化:"#{str.first(len)}#{'...' if str.size > len }"
    • 顺便说一句,这个答案几乎是我的 cmets 的完整副本)
    • 你在我上次评论之后才添加了Or slightly simplified 部分)
    • 没问题。如果您想将您的 cmets 移到更容易被发现的答案中,我很高兴删除我的答案,因为您击败了我。如果不是,我将保持原样 - 我认为在可发现性方面,答案优于评论线程。
    • 不用删了,以后加as mentioned in comments就行了,真的很好听。对不起,我的粗鲁,我不想冒犯你。
    猜你喜欢
    • 1970-01-01
    • 2015-07-04
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多