Daniel Viglione
Daniel Viglione

Reputation: 9407

truncate text after exceeding certain size

Rails offers the truncate method when you want to truncate text that exceeds a certain character length. This is the example provided here:

truncate("Once upon a time in a world far far away")
# => "Once upon a time in a world..."

It truncates a given text after a given :length if text is longer than :length

But I have the following example:

str = "abcdefhijklmno"

After 12 characters I want it truncated, so the above text should look like this:

abcdefhijklm...

But I tried using the truncate method and cannot get the desired result:

> str = "abcdefhijklmno"
 => "abcdefhijklmno" 
> str.truncate(15)
 => "abcdefhijklmno" 
> str.truncate(14)
 => "abcdefhijklmno" 
> str.truncate(13)
 => "abcdefhijk..." 
> str.truncate(12)
 => "abcdefhij..."

I would think that truncate(12) would do it but it truncates after 9 characters. What am I doing wrong?

Upvotes: 0

Views: 1656

Answers (2)

Dathan
Dathan

Reputation: 7446

I don't believe str.truncate will do what you want out of the box. But since it's really just an extra if statement, it's easy to write:

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

Or slightly simplified, and without a Rails dependency (as mentioned by Ilya in the comments):

def trunc(str, len)
  "#{str.first(len)}#{'...' if str.size > len}"
end

And the test cases:

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

Upvotes: 1

Ilya
Ilya

Reputation: 13477

argument of truncate means size of output string (with "..."):

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

You can change default omission(...) by empty space if you want:

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

More about Rails String#truncate here.

Upvotes: 2

Related Questions