将长固定数转换为数组Ruby

时间:2012-10-16 05:22:25

标签: ruby arrays fixnum

ruby​​中是否有方法可以将像74239这样的fixnum转换为像[7,4,2,3,9]这样的数组?

7 个答案:

答案 0 :(得分:15)

也许不是最优雅的解决方案:

74239.to_s.split('').map(&:to_i)

输出:

[7, 4, 2, 3, 9]

答案 1 :(得分:7)

对于这类事情,你不需要通过字符串陆地进行往返:

def digits(n)
    Math.log10(n).floor.downto(0).map { |i| (n / 10**i) % 10 }
end

ary = digits(74239)
# [7, 4, 2, 3, 9]

这确实假设n当然是肯定的,如果需要,将n = n.abs滑入混音可以处理。如果您需要涵盖非正值,那么:

def digits(n)
    return [0] if(n == 0)
    if(n < 0)
       neg = true
       n   = n.abs
    end
    a = Math.log10(n).floor.downto(0).map { |i| (n / 10**i) % 10 }
    a[0] *= -1 if(neg)
    a
end

答案 2 :(得分:5)

divmod方法可用于一次提取一个数字

def digits n
  n= n.abs
  [].tap do |result|
    while n > 0 
      n,digit = n.divmod 10
      result.unshift digit
    end
  end
end

快速基准显示,这比使用日志提前查找数字更快,这本身比基于字符串的方法更快。

bmbm(5) do |x|
  x.report('string') {10000.times {digits_s(rand(1000000000))}}
  x.report('divmod') {10000.times {digits_divmod(rand(1000000000))}}
  x.report('log') {10000.times {digits(rand(1000000000))}}
end

#=>
             user     system      total        real
string   0.120000   0.000000   0.120000 (  0.126119)
divmod   0.030000   0.000000   0.030000 (  0.023148)
log      0.040000   0.000000   0.040000 (  0.045285)

答案 3 :(得分:4)

您可以转换为字符串并使用字符方法:

74239.to_s.chars.map(&:to_i)

输出:

[7, 4, 2, 3, 9]

它比分裂更优雅。

答案 4 :(得分:1)

您也可以使用Array.new代替map

n = 74239

s = Math.log10(n).to_i + 1 # Gets the size of n

Array.new(s) { d = n % 10; n = n / 10; d }.reverse 

答案 5 :(得分:1)

在Ruby 2.4中,整数将具有digits method

答案 6 :(得分:1)

从Ruby 2.4开始,整数(FixNum is gone in 2.4+)具有内置的digits方法,可将它们提取到其数字数组中:

74239.digits
=> [9, 3, 2, 4, 7]

如果要保持数字的顺序,只需将reverse链接起来:

74239.digits.reverse
=> [7, 4, 2, 3, 9]

文档:https://ruby-doc.org/core-2.4.0/Integer.html#method-i-digits