TelephoneNumber 是基于 Google 的 libphonenumber 库的全球电话号码验证 gem。
请随意查看我们的演示!
号码杰克
将此行添加到应用程序的 Gemfile 中:
gem 'telephone_number'
然后执行:
$ bundle
或者自己安装:
$ gem install telephone_number
该库需要 Ruby 2.4 或更高版本。
validates :my_attribute_name, telephone_number: {country: proc{|record| record.country}, types: [:fixed_line, :mobile, etc]}
:area_code_optional
:fixed_line
:mobile
:no_international_dialling
:pager
:personal_number
:premium_rate
:shared_cost
:toll_free
:uan
:voicemail
:voip
record.country
必须生成有效的两个字母国家/地区代码,例如:us
、 :ca
或'DE'
String
或Symbol
而不是Proc
。 您可以通过调用以下方式获取TelephoneNumber
对象:
phone_object = TelephoneNumber.parse("3175082237", :us) ==>
#
之后,您可以使用以下实例方法。
valid_types
返回该数字被认为有效的所有类型。
phone_object.valid_types ==> [:fixed_line, :mobile, :toll_free]
valid?
返回布尔值,指示valid_types
是否为空。
phone_object.valid? ==> true
national_number(formatted: true)
返回国家格式的数字,包括特殊字符,例如括号和破折号。您可以通过传递formatted: false
来省略特殊字符
phone_object.national_number ==> "(317) 508-2237"
international_number(formatted: true)
返回国际格式的数字,包括特殊字符,例如括号和破折号。您可以通过传递formatted: false
来省略特殊字符
phone_object.international_number ==> "+1 317-508-2237"
e164_number(formatted: true)
返回国际格式的数字,包括特殊字符,例如括号和破折号。您可以通过传递formatted: false
来省略特殊字符
phone_object.e164_number ==> "+13175082237"
country
返回一个对象,其中包含与号码所在国家/地区相关的数据。
phone_object.country ===>
#
location
返回号码的位置。默认区域设置是:en
phone_object.location ==> "Indiana"
phone_object.location(:ja) ==> "ソウル特別市"
timezone
返回号码的时区。
phone_object.timezone ==> "America/New_York"
您还可以使用以下类方法。
parse
返回一个 TelephoneNumber 对象。
TelephoneNumber.parse("3175082237", :US)
如果您传递 E164 格式的号码,我们将即时确定所在国家/地区。
TelephoneNumber.parse("+13175082237")
valid?
返回布尔值,指示特定数字是否有效。
TelephoneNumber.valid?("3175082237", :US) ==> true
如果您希望针对一组特定的密钥进行验证,您可以传入一组密钥
TelephoneNumber.valid?("3175082237", :US, [:mobile, :fixed_line]) ==> true
TelephoneNumber.valid?("3175082237", :US, [:toll_free]) ==> false
invalid?
返回布尔值,指示特定数字是否无效。
TelephoneNumber.invalid?("3175082237", :US) ==> false
如果您希望针对一组特定的键进行无效,您可以传入一组键
TelephoneNumber.invalid?("3175082237", :US, [:mobile, :fixed_line]) ==> false
TelephoneNumber.invalid?("3175082237", :US, [:toll_free]) ==> true
如果您需要覆盖 Google 提供的数据,可以通过设置覆盖文件来实现。该文件预计与 Google 的格式相同,并使用 Marshal 进行序列化。
要生成序列化覆盖文件:
ruby bin/console
TelephoneNumber.generate_override_file("/path/to/file")
在本例中, /path/to/file
表示一个 xml 文件,其中包含您的自定义数据,其结构与 Google 数据的结构相同。
您可以使用以下命令设置覆盖文件:
TelephoneNumber.override_file = "/path/to_file.dat"
如果向 TelephoneNumber 传递了一个无效号码,然后要求对该号码进行格式化,则它只会返回原始传递号码的未格式化字符串。这是因为无法找到无效数字的格式规则。如果这是不可接受的,您可以设置default_format_pattern
和default_format_string
,TelephoneNumber 将使用它们尝试格式化无效号码。
TelephoneNumber.default_format_pattern = "(\d{3})(\d{3})(\d*)"
TelephoneNumber.default_format_string = "($1) $2-$3"
invalid_number = "1111111111"
phone_object = TelephoneNumber.parse(invalid_number, :US)
phone_object.national_number ==> "(111) 111-1111"
查看存储库后,运行bin/setup
以安装依赖项。然后,运行rake test
来运行测试。您还可以运行bin/console
以获得交互式提示,以便您进行实验。
在开发新功能时,您可能需要针对特定电话号码进行测试。为此,请将号码添加到lib/telephone_number/test_data_generator.rb
中,然后运行rake data:test:import
。该命令将访问 Google 提供的演示应用程序并提取正确的格式进行测试。
要将此 gem 安装到本地计算机上,请运行bundle exec rake install
。
欢迎在 GitHub 上提交错误报告和拉取请求:https://github.com/mobi/telephone_number。该项目旨在成为一个安全、温馨的协作空间,贡献者应遵守贡献者契约行为准则。
该 gem 根据 MIT 许可证条款作为开源提供。