取一个数字并将其拆分为一维数组中的索引组

时间:2015-06-03 05:16:51

标签: arrays ruby

我有一个像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!

3 个答案:

答案 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