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