如何将字符串数组转换为逗号分隔的字符串?

Kas*_*ail 64 ruby arrays ruby-on-rails

我有一个数组:

array = ["10", "20", "50", "99"]
Run Code Online (Sandbox Code Playgroud)

并希望将其转换为一个简单的逗号分隔字符串列表,如下所示:

"10", "20", "50", "99"
Run Code Online (Sandbox Code Playgroud)

Mat*_*att 113

array.join(',')几乎可以做你想做的事; 它不会保留值后面的引号或后面的空格.

保留引号和空格:array.map{|item| %Q{"#{item}"}}.join(', ') 这将打印"\"10\", \"20\", \"50\", \"99\"".假设问题确实需要单个字符串,则转义引号是必要的.

关于%Q:字符串文字的文档.

可以inspect按照另一个答案的建议使用,我会说这是个人偏好.我不会,去看看源代码并自己选择.

有用的一边:array.to_sentence会给你一个"1,2,3和4"风格输出,这可能很好!

  • 刚刚在rails 3.2.5中进行了测试.`array.to_sentence`默认包含牛津逗号.要排除牛津逗号,可以使用`array.to_sentence(:last_word_connector =>"和")` (12认同)
  • 只是一个注释,`to_sentence'只存在于ActiveSupport的Rails中. (7认同)
  • 不,不,不会.加入不会给他报价. (5认同)
  • to_sentence 非常有用,不知道存在! (2认同)

scz*_*zzo 79

["10", "20", "50","99"].map(&:inspect).join(', ') # => '"10", "20", "50", "99"'
Run Code Online (Sandbox Code Playgroud)

  • 我在代码审查中失败了.`inspect`不打算以这种方式使用. (6认同)
  • `{映射| V | v.to_s.inspect}`将处理整数值和字符串. (4认同)

Lin*_*ios 17

这里:

array.map {|str| "\"#{str}\""}.join(',')
Run Code Online (Sandbox Code Playgroud)

  • 那个输出是正确的.反斜杠只表示它是字面引用,而不是语法引用. (4认同)
  • @ali:这是正确的输出.`\`是转义字符,所以`\``代表字符```而开头和结尾的简单```是字符串分隔符.你可能用`px`打印结果,相当于`puts x.inspect`,试试`puts x`代替 (2认同)

dbe*_*hur 10

几个答案都使用提供的解决方案#map,#inspect,#join.对于涉及元素中嵌入逗号和/或字符串分隔符的边缘情况,所有这些都无法获得CSV编码的某些细节.

这可能是一个更好的主意,使用stdlib类CSV然后滚动自己的.

irb> require 'csv'
=> true
irb> a = [10,'1,234','J.R. "Bob" Dobbs',3.14159]
=> [10, "1,234", "J.R. \"Bob\" Dobbs", 3.14159]
irb> puts a.to_csv
10,"1,234","J.R. ""Bob"" Dobbs",3.14159
Run Code Online (Sandbox Code Playgroud)

如果此编码不需要关心嵌入分隔符,或仅用于某些内部表示,则map.join解决方案就足够了,但如果生成数据以便与其他期望逗号分隔值(CSV)的程序交换,则它们将失败通常理解的表示.


Mic*_*lor 5

最简单的解决方案是使用内置的“.to_sentence”方法。

所以

["fred", "john", "amy"].to_sentence 输出 "fred, john, and amy"