Как отформатировать строку телефона в Ruby с дефисами? - PullRequest
0 голосов
/ 31 января 2019

У меня есть проблема, которую я не могу решить.Мне нужно написать phone_format метод, который бы принимал любую телефонную строку и выводил ее в группах по 3 цифры с дефисами

phone_format("555 123 1234") => "555-123-12-34"

phone_format("(+1) 888 33x19") => "188-833-19"

Но еслион заканчивается одной цифрой, такой как 999-9, измените его на 99-99.В идеале это будет один лайнер

Ответы [ 2 ]

0 голосов
/ 31 января 2019
R = /
    \d{2,3}   # match 2 or 3 digits (greedily)
    (?=       # begin positive lookahead
      \d{2,3} # match 2 or 3 digits 
      |       # or
      \z      # match the end of the string
    )         # end positive lookahead
    /x        # free-spacing regex definition mode

Условно написано

R = /\d{2,3}(?=\d{2,3}|\z)/

def doit(str)
  s = str.gsub(/\D/,'')
  return s if s.size < 4
  s.scan(R).join('-')
end

doit "555 123 123"
  #=> "555-123-123" 
doit "555 123 1234"
  #=> "555-123-12-34" 
doit "555 123 12345"
  #=> "555-123-123-45" 
doit "(+1) 888 33x19"
  #=> "188-833-19" 
doit "123"
  #=> "123" 
doit "1234"
  #=> "12-34" 
0 голосов
/ 31 января 2019

На самом деле не однострочник: вам нужно разобраться с особыми случаями.

def cut_by(str, cut)
  str.each_char.each_slice(cut).map(&:join).join('-')
end

def phone_format(str)
  str = str.gsub(/\D/, '')              # cleanup
  if str.size == 4                      # special case 1
    cut_by(str, 2)
  elsif str.size % 3 == 1               # special case 2
    cut_by(str[0..-5], 3) + "-" + cut_by(str[-4..], 2)
  else                                  # normal case
    cut_by(str, 3)
  end
end
...