2011-07-18 11 views
9

W jaki sposób zrobiłbyś listę i przekształciła ją w ciąg znaków rozdzielany przecinkami, z "i" przed ostatnim elementem w tablicy?Utwórz listę czytelną dla człowieka z "i" wstawionym przed ostatnim elementem z listy ruby.

wziąć coś takiego:

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

i przekształcić go w ten sposób:

=> "a, b, and c" 

Pamiętam Ruby miała sposobu na to. Szukałem jednak i nie mogłem go znaleźć. Dzięki za pomoc.

+3

+1 za pomocą przecinka Oxford! –

Odpowiedz

15

Spróbuj: [list[0...-1].join(", "), list.last].join(", and ").

Edytuj: Rails ma metodę, której prawdopodobnie szukałeś, o nazwie to_sentence.

W przypadku, gdy nie ma Rails lub nie chcą polegać na Rails, otwartą Array klasę i obejmują powyższej metody, jak:

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 
+0

Ach tak, to wszystko! to_sentence to robi. –

+0

to nie zadziała z tablicami z 1 elementem – fl00r

+0

i pustymi tablicami również – fl00r

0

może być lepszym sposobem, ale to będzie działać:

class Array 
    def to_human_string 
    arr = Array.new(self) 
    last = arr.pop 
    arr.join(", ") + ", and " + last.to_s 
    end 
end 

Zastosowanie:

['a','b','c'].to_human_string 
=> "a, b, and c" 

można dodać opcje do separatora, "i" i opcjonalny przecinek z oxford.

+0

, a to nie będzie działać z tablicami z 1 elementem – fl00r

4
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 

tak

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

w Rails I tu jest to_sentence metoda, która wykorzystuje i18n lokalizacje, jak również

Powiązane problemy