1

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

"12345678"

输出应该是:

"12,345,678"

到目前为止,我想出了:

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

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

4

6 回答 6

3

这类似于 Linuxious 答案,但更短一些:

p '12345678'.reverse.chars.each_slice(3).map(&:join).join(',').reverse
#=> "12,345,678"
于 2013-04-10T13:25:47.257 回答
1

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

"12345678".each_char.to_a.reverse.each_slice(3).to_a.reverse.map {|a| a.reverse.join}.join(',')
于 2013-04-10T13:23:06.617 回答
1

Railsnumber_with_delimiter使用这个正则表达式:

"12345678".gsub /(\d)(?=(\d\d\d)+(?!\d))/, '\1,'
# => "12,345,678"
于 2013-04-10T13:45:52.307 回答
1
"12345678".gsub(/(?<=\d)(?=(?:\d{3})+\z)/, ",")
于 2013-04-10T13:44:42.543 回答
1
"12345678".reverse.chars.each_slice(3).to_a.map{|x| x.join}.join(",").reverse

输出:

12,345,678
于 2013-04-10T13:28:30.720 回答
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"
于 2013-04-10T15:16:56.410 回答