Skip to content
E164 international phone number normalizing, splitting, formatting.
Branch: master
Clone or download
Latest commit cee52fe Feb 26, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
lib Fix error case. Feb 26, 2019
misc/issue-snippets Add an issue snippet for 270. Aug 16, 2015
qed Add error case reported in #428. Feb 26, 2019
spec Eliminate warnings. Feb 15, 2019
.gitignore Add vendor/lib to .gitignore. May 23, 2015
.travis.yml Update Dec 1, 2017
Gemfile Add gem release to Gemfile. Feb 6, 2019
LICENSE Update LICENSE. Oct 21, 2016
README.textile Update to 2 MBs n the README (#415). Nov 16, 2018
Rakefile Bundle update. Nov 24, 2017


Coverage Status


Disclaimer: Phony works with international numbers only, such as +61 412 345 678!

The (admittedly crazy) goal of this Gem is to be able to normalize/format/split all phone numbers in the world.

Used in:,, (and many, many others).

Runtime Memory Usage

According to memory_profiler, the Phony gem uses roughly 2 MBs of memory per Ruby process.
Usage was generated using: ruby -e 'require "memory_profiler"; "phony"){ require "phony" }.pretty_print'


This gem normalizes, formats and splits E164 phone numbers. A valid E164 phone number must include a country code.

E164 numbers are international numbers with a country dial prefix, usually an area code and a subscriber number. For example, the Australian number +61 412 345 678 can be broken down into the following components:

  • Country Code (CC): a country code of 61
  • National Destination Code (NDC): a mobile number denoted by the 4 (specific to Australia)
  • Local Number Part: a subscriber number of 12 345 678

It currently handles the countries listed at the end of this README.

It is covered by roughly 2,000 tests (January 2016).
If it doesn’t work, please enter an issue or better, fork and send a pull request.


With Rails? Check out:

With Bundler: Append gem 'phony' to your Gemfile and bundle install it.

Without Bundler: Run gem install phony from your command line.

Usage docs

Phony uses qed as docs and to run its functional tests. Start here for usage docs: Usage index.


Normalize intelligently removes all non-numeric characters of a number. Do it before storing a number in a DB.

Phony.normalize docs

Phony.normalize('1-888-407-4747').assert == '18884074747'

Phony.format(number, options = {})

Format formats a normalized number according to a country’s predominant formatting. Lots of options for int’l, national, local formatting.

Phony.format docs

Phony.format('41443643532').assert == '+41 44 364 35 32'

Phony.plausible?(number, options = {})

Is a number plausible?

Phony.plausible? docs

Phony.assert.plausible?('+41 44 111 22 33')


Split a number into its parts: CC, NDC, local.

Phony.split docs

Phony.split('3928061371').assert == ['39', '2', '806', '1371']

NB If a country does not have an NDC, #split will return false in the NDC position, for example for Denmark:

Phony.split('4512121212').assert == ['45', false, '12', '12', '12', '12']

List of Handled Countries

Mildly unmaintained list: Abhas, Afghan, Algerian, Argentina, Austrian, Australian, Azerbaijani, Belgian, Brazilian, Cambodian, Chilean, Chinese, Croatian, Cuban, Cypriot, Czech, Danish, Dutch, Egyptian, El Salvadorian, Estonian, French, German, Ghanan, Gibraltar, Greek, Haiti, Hong Kong, Hungarian, Indian, Iran, Irish, Israel, Italian, Kazakh, Liberian, Lithuanian, Luxembourgian, Malaysian, Malta, Mexican, Monaco, Morocco, New Zealand, Nigerian, Norwegian, Peruvian, Polish, Romanian, Russian, Rwandan, Seychelles, Singapore, Slovakian, South African, South Korean, South Osetian, Spanish, Sri Lankan, Sudan, Swedish, Swiss, Thailand, Tunisian, Turkish, Liechtenstein, UK, US, Venezuelan, Vietnamese, and Zambian numbers.


See LICENSE file.

You can’t perform that action at this time.