我正在尝试将逗号插入每三位数字的字符串中。插值必须从字符串的末尾开始。所以,输入是:
"12345678"
输出应该是:
"12,345,678"
到目前为止,我想出了:
"12345678".reverse.gsub(/(\d{3})(?=.)/) { $1 + ',' }.reverse
但这对我来说似乎有点笨拙。关于如何更优雅地解决这个问题的任何想法?
这类似于 Linuxious 答案,但更短一些:
p '12345678'.reverse.chars.each_slice(3).map(&:join).join(',').reverse
#=> "12,345,678"
这里有一些比你的解决方案更干净的东西(不多,但至少它不涉及正则表达式:)):
"12345678".each_char.to_a.reverse.each_slice(3).to_a.reverse.map {|a| a.reverse.join}.join(',')
Railsnumber_with_delimiter
使用这个正则表达式:
"12345678".gsub /(\d)(?=(\d\d\d)+(?!\d))/, '\1,'
# => "12,345,678"
"12345678".gsub(/(?<=\d)(?=(?:\d{3})+\z)/, ",")
"12345678".reverse.chars.each_slice(3).to_a.map{|x| x.join}.join(",").reverse
输出:
12,345,678
另一种选择,更概括一点,以便更容易适应方法,并使用更新的 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"