在 phone 号码中添加 '-' 以及分机号

Add the '-' in the phone number, along with the ext

我需要一种方法来将“-”添加到 phone 号码中,验证它的长度是否正确,在区号周围添加括号,如果没有给出分机号则默认为 nil。例如:

9876542123 ext: 6789 -> Should end up -> (987)654-2123 ext: 6789
4543456 -> should fail
9876785678 ext: -> should end up -> (987)678-5678

如果没有正则表达式,我该如何做到这一点?

我尝试过的:

def format_phone_number(num)
  num.insert(0, '(').insert(-3, ')').insert(-4, '-')
end

输出:

(12345678-)94

以下内容应该与您正在查找的内容非常相似。当您将一个字符插入到一个字符串中时,您必须记住您将字符串的长度增加 1。此外,使用带插入的负索引,将字符插入位置 num.length - index.

def format_phone_number(num)
  if num.length >= 10
    num.insert(0, '(').insert(4, ')').insert(8, '-')
  end
end

如果 phone 号码长度不合适,我不确定你想要什么 return。

您必须处理每次调用 insert 时更改字符串大小的副作用:

def format_phone_number(num)
  num.insert(0, '(')
  puts num                       #=> (9876785678
  puts num.size                  #=> 11
  num.insert(4, ')')
  puts num                       #=> (987)6785678
  puts num.size                  #=> 12
  num.insert(8, '-')
  puts num                       #=> (987)678-5678 
  puts num.size                  #=> 13 
end

format_phone_number("9876785678")

要处理 phone 个少于 10 个字符的数字,您可以 raise 一个例外:

def format_phone_number(num)
  raise "Less than 10 chars" if num.size < 10
  num.insert(0, '(').insert(4, ')').insert(8, '-')
end

format_phone_number "9876785678"            #=> (987)654-2123   
format_phone_number "9876542123 ext: 6789"  #=> (987)654-2123 ext: 6789
format_phone_number "9876542123 ext:"       #=> (987)654-2123 ext: 
format_phone_number "987678567"             #=> in `format_phone_number': Less than 10 chars (RuntimeError) 

我真的不明白为什么,但这行得通:

def format_phone_number(num)
  num.insert(0, '(').insert(4, ')').insert(8, '-')
end

当我输入:

1234567894 -> (123)456-7894

这个问题很好地说明了使用正则表达式解决这类问题的好处。让我们比较使用正则表达式的方法和不使用正则表达式的方法,以获得相同级别的功能(如示例中所体现的)。

使用正则表达式

R = /
    \A                  # match beginning of string
    (\d{3})             # match 3 digits in capture group 1
    (\d{3})             # match 3 digits in capture group 2
    (\d{4})             # match 3 digits in capture group 3
    (                   # begin capture group 4 
      \sext:            # match space, string
      (?:\s\d+)?        # optionally match space, >= 1 digits in non-capture group
      \z                # match end of string
      |                 # or
      \z                # match end of string
    )                   # end capture group 4
    /x                  # free-spacing regex definition mode

def format_phone_number(num)
  return nil unless (num.strip) =~ R
  ext = ( == " ext:") ? '' : 
  "(%s)%s-%s%s" % [, , , ext]
end

format_phone_number "9876542123 ext: 6789"  #=> "(987)654-2123 ext: 6789" 
format_phone_number "9876542123 ext: 6789 " #=> "(987)654-2123 ext: 6789" 
format_phone_number "9876785678 ext:"       #=> "(987)678-5678" 
format_phone_number "9876785678"            #=> "(987)678-5678" 
format_phone_number "4543456"               #=> nil 
format_phone_number "#9876785678"           #=> nil 
format_phone_number "98765421234 ext: 6789" #=> nil 
format_phone_number "9876542123 ext.: 6789" #=> nil 
format_phone_number "9876542123 ext:6789"   #=> nil 
format_phone_number "9876542123 ext: 6789#" #=> nil 
format_phone_number "9876542123ext: 6789"   #=> nil 

不要使用正则表达式

def format_phone_number(num)
  str = num.strip
  return nil if str.size < 10
  nbr, ext = str[0,10], str[10..-1]
  ext = "" if ext == " ext:"
  return nil unless (Integer(nbr) rescue false)
  return nil unless ext.empty? || ext[0,6] == " ext: "
  return nil unless (ext.empty? || (Integer(ext[6..-1]) rescue false))
  "(%s)%s-%s%s" % [num[0,3], num[3,3], num[6,4], ext]
end

format_phone_number "9876542123 ext: 6789"  #=> "(987)654-2123 ext: 6789" 
format_phone_number "9876542123 ext: 6789 " #=> "(987)654-2123 ext: 6789" 
format_phone_number "9876785678 ext:"       #=> "(987)678-5678" 
format_phone_number "9876785678"            #=> "(987)678-5678" 
format_phone_number "4543456"               #=> nil 
format_phone_number "#9876785678"           #=> nil 
format_phone_number "98765421234 ext: 6789" #=> nil 
format_phone_number "9876542123 ext.: 6789" #=> nil 
format_phone_number "9876542123 ext:6789"   #=> nil 
format_phone_number "9876542123 ext: 6789#" #=> nil 
format_phone_number "9876542123ext: 6789"   #=> nil