2015-07-05 2 views
1

Есть ли метод в рубине, который позволяет разбивать целые числа на 1, 10, 100, 1000, ...?Как получить 10, 100, 1000 с целого числа?

Я знаю, что вы можете преобразовать целое число в строку и проанализировать строку, чтобы получить значения, упомянутые выше, но я бы предположил, что есть действительно простой способ сделать это с рубином, как и большинство других вещей. Пока у меня есть это:

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

Но есть ли что-то конкретное для этого в рубине?

+0

Прямо вперед ... создайте метод, и там вы идете. – vgoff

+0

Две вещи делают ваш вопрос излишне сложным: (1) порядок отменен, (2) полномочия 10 выражены излишними. Если бы вы попросили '[1, 2, 3, 4]', то это было бы намного проще. – sawa

+1

Таким образом, для ввода '1020' выход будет' [0, 20, 0, 1000] '. Это действительно то, что вы хотите для сотен мест? – pjs

ответ

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} 
+0

Моя первоначальная реакция заключалась в использовании log10, но я забыл использовать ceil. Хорошее решение Кэри. Мое решение также использовало хэш, но я удалил его по первому вопросу. Я также предпочел бы это в другом порядке, чтобы отразить совпадение слева направо с чтением исходного номера. – vgoff

+0

@vgoff, люди (в основном старожилы) продолжают сообщать мне, что нет порядка к парам ключ-значение хэша. :-) –

+0

Это был порядок массива, о котором я говорил, а не хэш. И, конечно же, теперь у хэшей есть предсказуемый порядок. – vgoff

0

Это не особенно умно, но я полагаю, что относительно ясно, что он делает.

def tens_places(n, place = 1) 
    if n >= 1 
    [(n % 10).floor * place] + tens_places(n/10, place * 10) 
    else 
    [] 
    end 
end 
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.

+0

Не ограничено базой 10. – vgoff

Смежные вопросы