2013-04-10 104 views
1

我试图将逗号插入每三位数字的字符串中。插值必须从字符串的末尾完成。因此,输入:从结尾开始每3个字符插入一个字符串

"12345678" 

和输出应该是:

"12,345,678" 

到目前为止,我想出了:

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

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

回答

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

'“123456”'给出'“,123,456”' – Stefan 2013-04-10 13:47:07

+0

谢谢,纠正。 – sawa 2013-04-10 13:48:13

+1

非常好的答案! – 2013-04-10 13:51:22

1

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

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

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

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

不错!我知道必须有更短的东西......任何东西都比正则表达式更好。正如那句老话:“我有99个问题,我用正则表达式来修复它们,现在我有100个问题”。 – Linuxios 2013-04-10 14:18:07

+0

@Linuxios你写的不错。贾斯汀的答案和我的一样,但太短,这很好。它是我的即兴表演。 :) :) – 2013-04-10 14:20:58

+0

@RubyLovely:谢谢。 – Linuxios 2013-04-10 14:21:44

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

输出:

12,345,678 
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" 
相关问题