Ruby library for phone number parsing, validation and formatting
Switch branches/tags
Nothing to show
Pull request Compare This branch is 4 commits ahead, 133 commits behind carr:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.



Parsing, validating and creating phone numbers. Forked to prevent class-name clashes.


You can install the phone library as a Rails plugin

script/plugin install git://


You can initialize a new phone object with the number, area code and country code.'5125486', '91', '385')

or => '5125486', :area_code => '91', :country_code => '385')


You can create a new phone object by parsing from a string. Validate::Phone does it's best to detect the country and area codes:

Validate::Phone.parse '+385915125486'
Validate::Phone.parse '00385915125486'

If the country or area code isn't given in the string, you must set it, otherwise it doesn't work:

Validate::Phone.parse '091/512-5486', :country_code => '385'
Validate::Phone.parse '(091) 512 5486', :country_code => '385'

If you feel that it's tedious, set the default country code once (in your config/environment.rb):

Validate::Phone.default_country_code = '385'    
Validate::Phone.parse '091/512-5486'
Validate::Phone.parse '(091) 512 5486'

Same goes for the area code:

Validate::Phone.parse '451-588', :country_code => '385', :area_code => '47'


Validate::Phone.default_country_code = '385'  
Validate::Phone.default_area_code = '47'

Validate::Phone.parse '451-588'

Automatic country and area code detection

Like it's stated above, Validate::Phone does it's best to automatically detect the country and area code while parsing. Do do this, phone uses data stored in data/countries.yml.

Each country code can have a regular expression named area_code that describes how the area code for that particular country looks like.

If an area_code regular expression isn't specified, the default, Validate::Phone::DEFAULT_AREA_CODE (correct for the US) is used.


Validating is very relaxed, basically it strips out everything that's not a number or '+' character:

Validate::Phone.valid? 'blabla 091/512-5486 blabla'


Formating is done via the format method. The method accepts a Symbol or a String.

When given a string, it interpolates the string with the following fields:

  • %c - country_code (385)

  • %a - area_code (91)

  • %A - area_code with leading zero (091)

  • %n - number (5125486)

  • %n1 - first @@n1_length characters of number (configured through Validate::Phone.n1_length), default is 3 (512)

  • %n2 - last characters of number (5486)

    pn = Validate::Phone.parse('+385915125486')
    pn.to_s # => "+385915125486"
    pn.format("%A/%f-%l") # => "091/512-5486"
    pn.format("+ %c (%a) %n") # => "+ 385 (91) 5125486"

When given a symbol it is used as a lookup for the format in the Validate::Phone.named_formats hash.

pn.format(:europe) # => "+385 (0) 91 512 5486"
pn.format(:us) # => "(234) 123 4567"

You can add your own custom named formats like so:

Validate::Phone.named_formats[:short] = '%A/%n1-%n2'    
pn.format(:short) # => 091/512-5486


Parse testing for different countries. Currently tested on: US, South Africa, Croatia, Slovenia, Hungary, Serbia, Bosnia and Herzegovina, Germany.


Copyright © 2010 Tomislav Car, Infinum