Как создать пробел между каждыми четырьмя целыми числами в Ruby? - PullRequest
6 голосов
/ 16 июня 2010

Я пытаюсь взять следующий номер:

423523420987

И преобразовать это в это:

4235 2342 0987

Это также не обязательно должно быть целым числом. На самом деле, я бы предпочел, чтобы это была строка.

Ответы [ 5 ]

13 голосов
/ 16 июня 2010

Вы можете использовать String::gsub с регулярным выражением:

=> 'abcdefghijkl'.gsub(/.{4}(?=.)/, '\0 ')
'abcd efgh ijkl'
13 голосов
/ 16 июня 2010
class String
  def in_groups_of(n, sep=' ')
    chars.each_slice(n).map(&:join).join(sep)
  end
end

423523420987.to_s.in_groups_of(4)      # => '4235 2342 0987'
423523420987.to_s.in_groups_of(5, '-') # => '42352-34209-87'
2 голосов
/ 16 июня 2010

Чтобы расширить ответ @Mark Byer's и комментарий @glenn mcdonald, что вы хотите сделать, если длина вашей строки / числа не кратна 4?

'1234567890'.gsub(/.{4}(?=.)/, '\0 ')
# => "1234 5678 90"

'1234567890'.reverse.gsub(/.{4}(?=.)/, '\0 ').reverse
# => "12 3456 7890"
2 голосов
/ 16 июня 2010

Если вы ищете мягкие нули, если у вас меньше 12 или больше 12 чисел, это поможет вам:

irb(main):002:0> 423523420987.to_s.scan(/\d{4}/).join(' ')
=> "4235 2342 0987"
irb(main):008:0> ('%d' % 423523420987).scan(/\d{4}/).join(' ')
=> "4235 2342 0987"
0 голосов
/ 16 июня 2010

Перебирайте каждую цифру и, если индекс цикла mod 4 = 0, ставьте пробел.

Модуль в рубине

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