2011-07-18 15 views
9

Bir listeyi alıp, dizideki son öğeden önce "ve" ile virgülle ayrılmış bir dizeye dönüştürürsünüz?Bir ruby ​​listesinden son öğeden önce eklenen "ve" ile birlikte okunabilir bir liste oluşturun

gibi bir şey atın:

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

Ve bu çevirmek:

=> "a, b, and c" 

ben yakut bunun için bir yöntem vardı hatırlıyorum. Ancak aradım ve bulamadım. Yardım için teşekkürler.

+3

+1 I18n yerel ayarları kullanan to_sentence yöntemdir! –

cevap

15

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

Düzenleme: Rails, muhtemelen aradığınız yöntemi to_sentence adı verilen yönteme sahiptir.

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

Ah evet, işte bu! to_sentence yapar. –

+0

bu, – fl00r

+0

1 öğeli dizilerle ve boş Diziler de – fl00r

0

daha iyi bir yolu olabilirdi, ama bu işe yarar: Eğer Rails yoksa veya, Ruby on açık Array sınıfı bağımlı istemeyen ve benzeri yukarıdaki yöntemi içermektedir durumda

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

Kullanımı: Sen sınırlayıcı seçeneklerini ekleyebilirsiniz

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

, 've' ve isteğe bağlı oxford virgülü.

+0

numaralı telefona sahip olursunuz ve bu, 1 elementli dizilerle çalışmayacaktır. – 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 

yüzden

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

Ve Rails

burada Oxford virgül kullanarak yanı

İlgili konular