从结尾开始每隔3个字符插入一个字符串

时间:2013-04-10 13:11:15

标签: ruby string

我正在尝试将逗号插入到每三位数的字符串中。插值必须从字符串的末尾开始。所以,输入是:

"12345678"

输出应为:

"12,345,678"

到目前为止,我提出了:

"12345678".reverse.gsub(/(\d{3})(?=.)/) { $1 + ',' }.reverse

但这对我来说似乎有点笨拙。关于如何更优雅地解决这个问题的任何想法?

6 个答案:

答案 0 :(得分:3)

这类似于Linuxious的答案,但有点短:

p '12345678'.reverse.chars.each_slice(3).map(&:join).join(',').reverse
#=> "12,345,678"

答案 1 :(得分:1)

这里的东西比你的解决方案更清晰(不多,但至少它不涉及正则表达式:)):

"12345678".each_char.to_a.reverse.each_slice(3).to_a.reverse.map {|a| a.reverse.join}.join(',')

答案 2 :(得分:1)

"12345678".reverse.chars.each_slice(3).to_a.map{|x| x.join}.join(",").reverse

输出:

12,345,678

答案 3 :(得分:1)

"12345678".gsub(/(?<=\d)(?=(?:\d{3})+\z)/, ",")

答案 4 :(得分:1)

Rails number_with_delimiter使用此正则表达式:

"12345678".gsub /(\d)(?=(\d\d\d)+(?!\d))/, '\1,'
# => "12,345,678"

答案 5 :(得分:0)

另一个替代方案,稍微概括一点,以便更容易适应方法,并使用更新的Ruby 2语法:

def intersperse(ns, char: ",", step: 3)
  ys = ""
  ns.chars.each_with_index{|n,i|
    ys << char if i % step == ns.length % step unless i == 0
    ys << n 
  }
  ys
end

ns = "12345678"
intersperse ns
# => "12,345,678"
intersperse ns, step: 2
# => "12,34,56,78"
intersperse ns, char: "!"
# => "12!345!678"