我試圖將逗號插入每三位數字的字符串中。插值必須從字符串的末尾完成。因此,輸入:從結尾開始每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