2011-07-18 36 views
9

Làm cách nào bạn lấy danh sách và đặt nó thành chuỗi được phân tách bằng dấu phẩy, với dấu "và" trước phần tử cuối cùng trong mảng?Tạo danh sách có thể đọc được bằng "và" được chèn vào trước phần tử cuối cùng từ danh sách ruby ​​

Đi cái gì đó như:

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

Và biến nó thành này:

=> "a, b, and c" 

Tôi nhớ ruby ​​có một phương pháp cho việc này. Tôi đã tìm kiếm tuy nhiên, và không thể tìm thấy nó. Cảm ơn sự giúp đỡ.

+3

1 cho việc sử dụng dấu phẩy Oxford! –

Trả lời

15

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

Chỉnh sửa: Đường ray có phương pháp bạn có thể đang tìm kiếm, được gọi là to_sentence.

Trong trường hợp bạn không có Rails hoặc không muốn phụ thuộc vào Rails, mở Array lớp và bao gồm các phương pháp trên, như:

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

À vâng, đúng vậy! to_sentence làm điều đó. –

+0

điều này sẽ không hoạt động với các mảng với 1 phần tử – fl00r

+0

và với các mảng trống cũng – fl00r

0

Có thể là một cách tốt hơn, nhưng điều này sẽ làm việc:

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

Cách sử dụng:

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

Bạn có thể thêm tùy chọn cho delimiter, 'và' và dấu phẩy oxford tùy chọn.

+0

và điều này sẽ không hoạt động với các mảng có 1 phần tử – 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 

nên

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

Và trong Rails đây là to_sentence phương pháp sử dụng miền địa phương i18n cũng

Các vấn đề liên quan