在电话号码中添加“ - ”以及分机号码

时间:2016-08-10 23:22:39

标签: ruby phone-number

我需要一种方法将' - '添加到电话号码中,验证它是否正确,在区号附近添加括号,如果没有给出扩展名,则默认为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

4 个答案:

答案 0 :(得分:2)

这个问题很好地说明了为这些类型的问题使用正则表达式的好处。我们将使用正则表达式的方法与不使用正则表达式的方法进行比较,以获得相同的功能级别(如示例所示)。

使用正则表达式

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 = ($4 == " ext:") ? '' : $4
  "(%s)%s-%s%s" % [$1, $2, $3, 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 

答案 1 :(得分:1)

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

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

如果电话号码不合适,我不确定您要返回什么。

答案 2 :(得分:1)

您必须处理在每次调用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")

要处理少于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) 

答案 3 :(得分:0)

我真的不明白为什么,但这很有效:

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

当我输入时:

1234567894 -> (123)456-7894