Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create a human-readable list with "and" inserted before the last element from a ruby list

Tags:

ruby

How would you take a list and make it into a comma-separated string, with "and" before the last element in the array?

Take something like:

list1 = ['a','b','c']

And turn it into this:

=> "a, b, and c"

I remember ruby had a method for this. I've searched however, and couldn't find it. Thanks for the help.

like image 400
Vivek Patel Avatar asked Jul 18 '11 18:07

Vivek Patel


2 Answers

Try: [list[0...-1].join(", "), list.last].join(", and ").

Edit: Rails has the method you were probably looking for, called to_sentence.

In case you do not have Rails or do not wish to depend on Rails, open Array class and include the above method, like:

class Array
  def join_all(join_with = ", ", connector = "and", last_comma = false)
    return self.to_s if self.empty? || self.size==1
    connector = join_with+connector if last_comma
    [list[0...-1].join(join_with), list.last].join(connector)
  end
end
like image 175
Miki Avatar answered Nov 05 '22 16:11

Miki


class Array
  def to_sentence
    sentence = self[0..-2].join(", ") + ", and " + self[-1].to_s if self.size > 1
    sentence ||= self.to_s
  end
end

so

[1].to_sentence
#=> "1"
[1,2,3].to_sentence
#=> "1, 2, and 3"
[].to_sentence
#=> ""

And in Rails here is to_sentence method that uses I18n locales as well

like image 28
fl00r Avatar answered Nov 05 '22 14:11

fl00r