我有一个像12,345,678这样的数字,我试图把它分成一个由3组组成的数组。这样如果我有:
where [Transaction].Date >= cast('2012.2.2' as date,102) and [Transaction].Date < cast('2012.2.3' as Date,102 )
然后我可以得到以下数组:
stack = 12345678
我正在考虑使用overflow = [12,345,678]
,就像这里提到的另一个类似问题一样,但这会创建一个2D数组。所以我考虑使用Enumberable#each_slice
,但这并不能保持我的数字正确分组。
有没有什么好方法可以做到这一点,还是会有一些讨厌的嵌套循环? THX!
答案 0 :(得分:2)
这可能效率不高,但有效。你可以建立/优化它。
stack.to_s.chars.reverse.each_slice(3).map {|s| s.reverse.join.to_i }.reverse
# => [12, 345, 678]
答案 1 :(得分:2)
对于纯Ruby方式(非Rails):
number = 12345678
number.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse
#=> "12,345,678"
> number.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse.split(',').map(&:to_i)
#=> [12, 345, 678] # your expected output
如果你想在轨道中使用,那么非常好的方法 number_with_delimiter
number_with_delimiter(12345678)
# => 12,345,678
答案 2 :(得分:2)
另一种选择:
def break_in_3s(num)
return [0] if num.zero?
a = []
until num.zero?
num, last = num.divmod(1000)
a.unshift(last)
end
a
end
break_in_3s(12_345_678)
#=> [12, 345, 678]
break_in_3s(2_345_678)
#=> [2, 345, 678]
break_in_3s(312_345_678)
#=> [312, 345, 678]
我认为num
是非负面的。
除此之外:为什么我们没有:
class Array; alias >> unshift; end
所以我们可以写:
a >> last