Turning long fixed number to array Ruby
You don't need to take a round trip through string-land for this sort of thing:
def digits(n) Math.log10(n).floor.downto(0).map { |i| (n / 10**i) % 10 }endary = digits(74239)# [7, 4, 2, 3, 9]
This does assume that n
is positive of course, slipping an n = n.abs
into the mix can take care of that if needed. If you need to cover non-positive values, then:
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) aend
The divmod method can be used to extract the digits one at a time
def digits n n= n.abs [].tap do |result| while n > 0 n,digit = n.divmod 10 result.unshift digit end endend
A quick benchmark showed this to be faster than using log to find the number of digits ahead of time, which was itself faster than string based methods.
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 realstring 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)