我试图将逗号插入每三位数字的字符串中。插值必须从字符串的末尾完成。因此,输入:从结尾开始每3个字符插入一个字符串
"12345678"
和输出应该是:
"12,345,678"
到目前为止,我想出了:
"12345678".reverse.gsub(/(\d{3})(?=.)/) { $1 + ',' }.reverse
但这似乎有点笨重给我。关于如何更优雅地解决这个问题的任何想法?
我试图将逗号插入每三位数字的字符串中。插值必须从字符串的末尾完成。因此,输入:从结尾开始每3个字符插入一个字符串
"12345678"
和输出应该是:
"12,345,678"
到目前为止,我想出了:
"12345678".reverse.gsub(/(\d{3})(?=.)/) { $1 + ',' }.reverse
但这似乎有点笨重给我。关于如何更优雅地解决这个问题的任何想法?
"12345678".gsub(/(?<=\d)(?=(?:\d{3})+\z)/, ",")
个
这里的东西比你的解决方案干净了一点(不多,但至少它不涉及正则表达式:)):
"12345678".each_char.to_a.reverse.each_slice(3).to_a.reverse.map {|a| a.reverse.join}.join(',')
这类似于Linuxious答案,但有点短:
p '12345678'.reverse.chars.each_slice(3).map(&:join).join(',').reverse
#=> "12,345,678"
"12345678".reverse.chars.each_slice(3).to_a.map{|x| x.join}.join(",").reverse
输出:
12,345,678
Rails的number_with_delimiter
使用这个表达式:
"12345678".gsub /(\d)(?=(\d\d\d)+(?!\d))/, '\1,'
# => "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"
'“123456”'给出'“,123,456”' – Stefan 2013-04-10 13:47:07
谢谢,纠正。 – sawa 2013-04-10 13:48:13
非常好的答案! – 2013-04-10 13:51:22