我曾使用Phony格式化电话号码(意思是,如果我输入了xxx-xxx-xxxx,它会将其转换为字符串,并告诉我是否有(1)在前面需要去掉)。
但它对我们的电话号码实际上并不起作用,它是为国际号码设计的。
是否存在相应的替代方案?
谢谢。
我曾使用Phony格式化电话号码(意思是,如果我输入了xxx-xxx-xxxx,它会将其转换为字符串,并告诉我是否有(1)在前面需要去掉)。
但它对我们的电话号码实际上并不起作用,它是为国际号码设计的。
是否存在相应的替代方案?
谢谢。
我从未见过一种可靠的电话号码格式化工具,因为这太难了,很难做到完美。就在你认为已经掌握了所有情况时,又会出现新的需要格式化的电话号码。
十位北美电话号码可能是最容易格式化的,你可以使用正则表达式,但一旦遇到分机号,就会遇到麻烦。不过,如果你想自己动手,还是有办法解决的:
def formatted_number(number)
digits = number.gsub(/\D/, '').split(//)
if (digits.length == 11 and digits[0] == '1')
# Strip leading 1
digits.shift
end
if (digits.length == 10)
# Rejoin for latest Ruby, remove next line if old Ruby
digits = digits.join
'(%s) %s-%s' % [ digits[0,3], digits[3,3], digits[6,4] ]
end
end
这段代码将会把11位和10位数字转换成你想要的格式。
以下是一些示例:
formatted_number("1 (703) 451-5115")
# => "(703) 451-5115"
formatted_number("555-555-1212")
# => "(555) 555-1212"
'(%s) %s-%s' % [ digits[0,3], digits[3,3], digits[6,4] ]
前插入 digits = digits.join
。 - jwal我写了这个正则表达式来匹配NANPA电话号码,并在几个月前将其转换为Rails验证器用于项目中。它对我来说很好用,但更实际而非严格符合规范。
# app/validators/phone_number_validator.rb
class PhoneNumberValidator < ActiveModel::EachValidator
@@regex = %r{\A(?:1(?:[. -])?)?(?:\((?=\d{3}\)))?([2-9]\d{2})(?:(?<=\(\d{3})\))? ?(?:(?<=\d{3})[.-])?([2-9]\d{2})[. -]?(\d{4})(?: (?:ext|x)\.? ?(\d{1,5}))?\Z}
def validate_each (object, attribute, value)
if m = value.match(@@regex)
# format the phone number consistently
object.send("#{attribute}=", "(#{m[1]}) #{m[2]}-#{m[3]}")
else
object.errors[attribute] << (options[:message] || "is not an appropriately formatted phone number")
end
end
end
# app/models/foobar.rb
class Foobar < ActiveRecord::Base
validates :phone, phone_number: true
end
object.send
行)。#RAILS_ROOT/lib/String.rb
class String
def convert_to_phone
number = self.gsub(/\D/, '').split(//)
#US 11-digit numbers
number = number.drop(1) if (number.count == 11 && number[0] == 1)
#US 10-digit numbers
number.to_s if (number.count == 10)
end
def format_phone
return "#{self[0,3]}-#{self[3,3]}-#{self[6,4]}"
end
end
"585-343-2070".convert_to_phone
=> "5853432070"
"5853432070".convert_to_phone
=> "5853432070"
"1(585)343-2070".convert_to_phone.format_phone
=> "585-343-2070"
##Everything formatted as requested in Asker's various comments
def format_phone_numbers(n)
"(#{n[-10..-8]}) #{n[-7..-5]}-#{n[-4..-1]}"
end
format_phone_numbers('555555555555')