2013-04-10 67 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" 
相關問題