如何从整数获得10s,100s,1000s?

时间:2015-07-05 13:25:06

标签: ruby

ruby​​中是否有一种方法可以将整数分解为1s,10s,100s,1000s,......?

我知道你可以将一个整数转换为一个字符串并解析字符串以获得上面提到的值,但我认为有一个非常简单的方法可以像大多数其他东西一样使用ruby。到目前为止,我有这个:

1234.to_s.chars.reverse.each_with_index
.map{|character, index| character.to_i * 10**index }
# => [4, 30, 200, 1000]

但红宝石中是否有特定的东西可以做到这一点?

3 个答案:

答案 0 :(得分:2)

你可以这样做:

n = 1020304

Math.log10(n).ceil.times.with_object([]) do |i,a|
  n, d = n.divmod(10)
  a << d * 10**i
end
  #=> [4, 0, 300, 0, 20000, 0, 1000000] 

嗯。这看起来有点奇怪。也许返回哈希会更好:

Math.log10(n).ceil.times.with_object({}) do |i,h|
  n, d = n.divmod(10)
  h[10**i] = d
end
  #=> {1=>4, 10=>0, 100=>3, 1000=>0, 10000=>2, 100000=>0, 1000000=>1} 

答案 1 :(得分:1)

def value_of_powers(number, base: 10)
  number.to_s.reverse.each_char.with_index.map do |character, index|
    base**index * character.to_i
  end.reverse
end

value_of_powers(10212, base: 3) # => [81, 0, 18, 3, 2]
value_of_powers(1234)           # => [1000, 200, 30, 4]

我颠倒了顺序,以便按照读取数字的顺序读取值。

如图所示,它也适用于其他基数。如果没有基数,它将默认为10。

答案 2 :(得分:0)

这并不是特别聪明,但我认为它的作用相对清楚。

def tens_places(n, place = 1)
  if n >= 1
    [(n % 10).floor * place] + tens_places(n/10, place * 10)
  else
    []
  end
end