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

Arrays 取一个数字,将其拆分为一维数组中的索引组,arrays,ruby,Arrays,Ruby,我有一个像12345678这样的数字,我正试图将它拆分成一个3组的数组。如果我有: stack = 12345678 然后我可以得到以下数组: overflow = [12,345,678] 我在考虑使用Enumberable#每个_切片,就像这里提出的另一个类似问题一样,但这会创建一个二维数组。因此,我考虑使用数组#展平,但这并不能使我的数字正确分组 有没有什么好方法可以做到这一点,或者这将是一个讨厌的嵌套循环?谢谢 这可能效率不高,但确实有效。您可以在此基础上进行构建/优化 stack

我有一个像12345678这样的数字,我正试图将它拆分成一个3组的数组。如果我有:

stack = 12345678
然后我可以得到以下数组:

overflow = [12,345,678]
我在考虑使用
Enumberable#每个_切片
,就像这里提出的另一个类似问题一样,但这会创建一个二维数组。因此,我考虑使用
数组#展平
,但这并不能使我的数字正确分组


有没有什么好方法可以做到这一点,或者这将是一个讨厌的嵌套循环?谢谢

这可能效率不高,但确实有效。您可以在此基础上进行构建/优化

 stack.to_s.chars.reverse.each_slice(3).map {|s| s.reverse.join.to_i }.reverse
 # => [12, 345, 678]

这可能效率不高,但确实有效。您可以在此基础上进行构建/优化

 stack.to_s.chars.reverse.each_slice(3).map {|s| s.reverse.join.to_i }.reverse
 # => [12, 345, 678]
对于纯Ruby方式(非Rails):

如果您希望它出现在rails中,那么有一个非常好的方法

number_with_delimiter(12345678)
# => 12,345,678
对于纯Ruby方式(非Rails):

如果您希望它出现在rails中,那么有一个非常好的方法

number_with_delimiter(12345678)
# => 12,345,678
另一种选择:

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

另一个选项:

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

如果您在Rails上,您可以使用带分隔符(12345678)的
number\u#=>12345678
不在Rails上,只需使用纯Ruby即可。不过,如果你在Rails上,你可以使用带分隔符(12345678)的
number\u=>12345678
不在Rails上,只需使用纯Ruby即可。不过是Thx。