2011-07-18 8 views
9

¿Cómo tomarías una lista y la convertirías en una cadena separada por comas, con "y" antes del último elemento de la matriz?Crear una lista legible por humanos con "y" insertado antes del último elemento de una lista de ruby ​​

Tome algo como:

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

y convertirlo en esto:

=> "a, b, and c" 

recuerdo rubí tenía un método para esto. He buscado sin embargo, y no pude encontrarlo. Gracias por la ayuda.

+3

1 para el uso de la coma de Oxford! –

Respuesta

15

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

Editar: Rails tiene el método que probablemente estaba buscando, llamado to_sentence.

En caso de que no tiene rieles o no desea depender de rieles, abiertos clase Array e incluir el método anterior, como:

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 sí, eso es todo! to_sentence lo hace. –

+0

esto no funcionará con arreglos con 1 elemento – fl00r

+0

y con matrices vacías también – fl00r

0

podría haber una forma mejor, pero esto funcionaría:

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

Uso:

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

Se podría añadir opciones para el delimitador, el 'y' y la coma de oxford opcional.

+0

y esto no funcionará con arreglos con 1 elemento – 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 

por lo

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

Y en rieles aquí es to_sentence método que utiliza lugares I18n así

Cuestiones relacionadas