Как разбить длинное число на пары цифр - PullRequest
0 голосов
/ 28 мая 2019

У меня есть строка с длинным числом 12345678, и я хочу преобразовать ее в массив следующим образом:

["12", "34", "56", "78"].

Я пробовал array.split(//).map { |e| e.to_i }, но это

["1", "2", "3", "4", "5", "6", "7", "8"]

Ответы [ 3 ]

2 голосов
/ 28 мая 2019

Самый простой способ - использовать String#scan с регулярным выражением /../, которое соответствует любой паре символов:

n = 12345678

arr = n.to_s.scan(/../)
# => ["12", "34", "56", "78"]

Если вам нужно обработать нечетные числацифры и сохраните последнюю цифру, вместо этого используйте /..?/:

n = 123456789

arr = n.to_s.scan(/..?/)
# => ["12", "34", "56", "78", "9"]

Альтернативный подход - map в диапазоне 0...n.to_s.size с использованием метода Range#step:

n = 123456789
str = n.to_s

arr = (0...str.size).step(2).map {|i| str[i, 2] }
# => ["12", "34", "56", "78", "9"]

Вы можете увидеть все три подхода в действии на repl.it: https://repl.it/@jrunning/BlissfulAcclaimedStrategy

2 голосов
/ 28 мая 2019

Я думаю, что нет необходимости использовать регулярное выражение, я бы сделал что-то вроде этого:

12345678.to_s.chars.each_slice(2).map(&:join)
#=> ["12","34","56","78"]
1 голос
/ 28 мая 2019

Вы можете использовать

p = 123456789.to_s (0..p.length).each_cons(2).map {|i, j| "#{p[i]}#{p[j]}" if i%2 == 0}.compact

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...