Skip to content

Parse, validate, and format phone numbers in Ruby using Google's libphonenumber database

License

Notifications You must be signed in to change notification settings

flyerhzm/global_phone

 
 

Repository files navigation

GlobalPhone

GlobalPhone parses, validates, and formats local and international phone numbers according to the E.164 standard.

Store and display phone numbers in your app. Accept phone number input in national or international format. Convert phone numbers to international strings (+13125551212) for storage and retrieval. Present numbers in national format ((312) 555-1212) in your UI.

Designed with the future in mind. GlobalPhone uses format specifications from Google's open-source libphonenumber database. No need to upgrade the library when a new phone format is introduced—just generate a new copy of the database and check it into your app.

Pure Ruby. No dependencies. GlobalPhone is designed for Ruby 1.9.3 and up. (Works in 1.8.7, too—just bring your own json gem.)

Installation

  1. Add the global_phone gem to your app. For example, using Bundler:

     $ echo "gem 'global_phone'" >> Gemfile
     $ bundle install
    
  2. Use global_phone_dbgen to convert Google's libphonenumber PhoneNumberMetaData.xml file into a JSON database for GlobalPhone.

     $ gem install global_phone_dbgen
     $ global_phone_dbgen > db/global_phone.json
    
  3. Tell GlobalPhone where to find the database. For example, in a Rails app, create an initializer in config/initializers/global_phone.rb:

    require 'global_phone'
    GlobalPhone.db_path = Rails.root.join('db/global_phone.json')

Examples

Parse an international number string into a GlobalPhone::Number object:

number = GlobalPhone.parse('+1-312-555-1212')
# => #<GlobalPhone::Number type=fixed_line_or_mobile territory=#<GlobalPhone::Territory country_code=1 name=US> national_string="3125551212">

# Try to parse an invalid number
number = GlobalPhone.parse('+1-312-555-12125')
# => nil

number = GlobalPhone.parse('+1-905-847-1212')
# => #<GlobalPhone::Number type=fixed_line_or_mobile territory=#<GlobalPhone::Territory country_code=1 name=CA> national_string="9058471212">


number = GlobalPhone.parse('+44 7500 900129')
#  => #<GlobalPhone::Number type=mobile territory=#<GlobalPhone::Territory country_code=44 name=GB> national_string="7500900129"> 

Query the country code and likely territory name of the number:

number = GlobalPhone.parse('+1-312-555-1212')
number.country_code
# => "1"

number.territory.name
# => "US"

number.type
# => fixed_line_or_mobile

number.fixed_line?
# => true

number.mobile?
# => true

Present the number in national and international formats:

number.national_format
# => "(312) 555-1212"

number.international_format
# => "+1 312-555-1212"

Is the number valid? (Note: this is not definitive. For example, the number here is "valid" by format, but there are no US numbers that start with 555. The valid? method may return false positives, but should not return false negatives unless the database is out of date.)

number.valid?
# => true

Get the number's normalized E.164 international string:

number.international_string
# => "+13125551212"

Parse a number in national format for a given territory:

number = GlobalPhone.parse("(0) 20-7031-3000", :gb)
# => #<GlobalPhone::Number type=fixed_line territory=#<GlobalPhone::Territory country_code=44 name=GB> national_string="2070313000"> 

Parse an international number using a territory's international dialing prefix:

number = GlobalPhone.parse("00 1 3125551212", :gb)
# => #<GlobalPhone::Number type=fixed_line_or_mobile territory=#<GlobalPhone::Territory country_code=1 name=US> national_string="3125551212">

Set the default territory to Great Britain (territory names are ISO 3166-1 Alpha-2 codes):

GlobalPhone.default_territory_name = :gb
# => :gb

GlobalPhone.parse("(0) 20-7031-3000")
# => #<GlobalPhone::Number type=fixed_line territory=#<GlobalPhone::Territory country_code=44 name=GB> national_string="2070313000"> 

Shortcuts for validating a phone number:

GlobalPhone.validate("+1 312-555-1212")
# => true

GlobalPhone.validate("+442070313000")
# => true

GlobalPhone.validate("(0) 20-7031-3000")
# => nil

GlobalPhone.validate("(0) 20-7031-3000", :gb)
# => true

Shortcuts for normalizing a phone number in E.164 format:

GlobalPhone.normalize("(312) 555-1212")
# => "+13125551212"

GlobalPhone.normalize("+442070313000")
# => "+442070313000"

GlobalPhone.normalize("(0) 20-7031-3000")
# => nil

GlobalPhone.normalize("(0) 20-7031-3000", :gb)
# => "+442070313000"

Caveats

GlobalPhone currently does not parse emergency numbers or SMS short code numbers.

Validation is not definitive and may return false positives, but should not return false negatives unless the database is out of date.

Development

The GlobalPhone source code is hosted on GitHub. You can check out a copy of the latest code using Git:

$ git clone https://github.com/sstephenson/global_phone.git

If you've found a bug or have a question, please open an issue on the issue tracker. Or, clone the GlobalPhone repository, write a failing test case, fix the bug, and submit a pull request.

GlobalPhone is heavily inspired by Andreas Gal's PhoneNumber.js library.

Version History

1.0.2 (June 15, 2013)

  • When an internationally formatted number is used in GlobalPhone.parse, it will determine the territory of the number
  • GlobalPhone::Number has new methods - type (to determine the type of the phone), fixed_line?, mobile?

1.0.1 (May 29, 2013)

  • GlobalPhone::Number#to_s returns the E.164 international string.
  • Ensure GlobalPhone::Number always returns strings for #national_format, #international_format, and #international_string, regardless of validity.
  • Relax format restrictions to more loosely match available national number patterns.

1.0.0 (May 28, 2013)

  • Initial public release.

License

Copyright © 2013 Sam Stephenson

Released under the MIT license. See LICENSE for details.

About

Parse, validate, and format phone numbers in Ruby using Google's libphonenumber database

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Ruby 99.1%
  • Shell 0.9%