是否有一颗gem可以规范并格式化ruby中的美国电话号码?

我使用假冒来格式化电话号码(意思是,如果我放入xxx-xxx-xxxx它会转换为字符串,并且还告诉它是否有(1)之前将其删除)。

但它确实对我们的电话号码不起作用,它是专为国际号码而设计的。

有同等的吗?

谢谢。

http://rubygems.org/gems/phony

今年早些时候,我回顾了一堆解析和格式化电话号码的ruby。 他们分为若干组(见下文)。 TLDR:我使用’手机’。 它可能适合您,因为如果您的电话号码不包含,则可以指定它使用的默认国家/地区代码。

1)以美国为中心:

大话(0.1.4)
phone_wrangler(0.1.3)
simple_phone_number(0.1.9)

2)取决于rails或active_record:

phone_number(1.2.0)
validates_and_formats_phones(0.0.7)

3)已经合并回主干的“电话”叉子:

elskwid-phone(0.9.9.4)
电话(0.9.9.1)

4)依靠您提前了解该地区

音素(0.1.0)

5)几乎对我有用

电话(0.9.9.3)

6)gem名称中不包含子字符串’phone’ (编辑:我看到你试过这个)

假的(1.6.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" 

我写了这个正则表达式来匹配NANPA电话号码与PHP的一些约定(例如扩展)(感谢上帝那些日子结束)并在几个月前将它转换为Railsvalidation器用于项目。 它对我来说很有用,但它比规范更严格。

 # 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 

保存/输出的格式如下:(888)888-8888。 目前输出剥离扩展,因为我不需要它。 您可以将其重新添加并轻松更改格式(请参阅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 

您可以使用rails number_to_phone方法

见这里: http : //api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html#method-i-number_to_phone