Google's common Java, C++ and JavaScript library for parsing, formatting, and validating international phone numbers.
Google’s common Java, C++ and JavaScript library for parsing, formatting, and
validating international phone numbers. The Java version is optimized for
running on smartphones, and is used by the Android framework since 4.0 (Ice
Cream Sandwich).
README
s ingetNumberType
- gets the type of the number based on the number itself;isNumberMatch
- gets a confidence level on whether two numbers could begetExampleNumber
and getExampleNumberForType
- provide valid exampleisPossibleNumber
- quickly guesses whether a number is a possibleisValidNumber
- full validation of a phone number for a region usingAsYouTypeFormatter
- formats phone numbers on-the-fly when users enterfindNumbers
- finds numbers in text.PhoneNumberOfflineGeocoder
- provides geographical information related toPhoneNumberToCarrierMapper
- provides carrier information related to aPhoneNumberToTimeZonesMapper
- provides timezone information related to aThe Java demo is updated with a slight
delay after the GitHub release.
Last demo update: v8.13.52.
Note: Even though the library (main branch/maven release)
is at v8.12.57, because of some deployment issues, we were unable to update the
Java demo with the new binary version. We will soon fix this. Meantime, please
use JS demo.
If this number is lower than the latest release’s version
number, we are between
releases and the demo may be at either version.
There is a demo Android App called E.164 Formatter in this
repository. The purpose of this App is to show an example of how the library can
be used in a real-life situation, in this case specifically in an Android App
using Java.
The JavaScript
demo
may be run at various tags; this link will take you to master
.
To include the Java code in your application, either integrate with Maven (see
wiki) or download the latest
jars from the Maven
repository.
Javadoc is automatically updated to reflect the latest release at
https://javadoc.io/doc/com.googlecode.libphonenumber/libphonenumber/.
We generally choose the release number following these guidelines.
If any of the changes pushed to master since the last release are incompatible
with the intent / specification of an existing libphonenumber API or may cause
libphonenumber (Java, C++, or JS) clients to have to change their code to keep
building, we publish a major release. For example, if the last release were
7.7.3, the new one would be 8.0.0.
If any of those changes enable clients to update their code to take advantage
of new functionality, and if clients would have to roll-back these changes in
the event that the release was marked as “bad”, we publish a minor release. For
example, we’d go from 7.7.3 to 7.8.0.
Otherwise, including when a release contains only
metadata changes, we publish a sub-minor release,
e.g. 7.7.3 to 7.7.4.
Sometimes we make internal changes to the code or metadata that, while not
affecting compatibility for clients, could affect compatibility for porters
of the library. For such changes we make announcements to
libphonenumber-discuss. Such changes
are not reflected in the version number, and we would publish a sub-minor
release if there were no other changes.
Want to get notified of new releases? During most of the year, excepting
holidays and extenuating circumstances, we release fortnightly. We update
release tags and
document detailed release notes.
We also send an announcement to libphonenumber-discuss for every
release.
Let’s say you have a string representing a phone number from Switzerland. This
is how you parse/normalize it into a PhoneNumber
object:
String swissNumberStr = "044 668 18 00";
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
try {
PhoneNumber swissNumberProto = phoneUtil.parse(swissNumberStr, "CH");
} catch (NumberParseException e) {
System.err.println("NumberParseException was thrown: " + e.toString());
}
At this point, swissNumberProto
contains:
{
"country_code": 41,
"national_number": 446681800
}
PhoneNumber
is a class that was originally auto-generated from
phonenumber.proto
with necessary modifications for efficiency. For details on
the meaning of each field, refer to resources/phonenumber.proto
.
Now let us validate whether the number is valid:
boolean isValid = phoneUtil.isValidNumber(swissNumberProto); // returns true
There are a few formats supported by the formatting method, as illustrated
below:
// Produces "+41 44 668 18 00"
System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.INTERNATIONAL));
// Produces "044 668 18 00"
System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.NATIONAL));
// Produces "+41446681800"
System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.E164));
You could also choose to format the number in the way it is dialed from another
country:
// Produces "011 41 44 668 1800", the number when it is dialed in the United States.
System.out.println(phoneUtil.formatOutOfCountryCallingNumber(swissNumberProto, "US"));
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("US");
System.out.println(formatter.inputDigit('6')); // Outputs "6"
... // Input more digits
System.out.println(formatter.inputDigit('3')); // Now outputs "650 253"
PhoneNumberOfflineGeocoder geocoder = PhoneNumberOfflineGeocoder.getInstance();
// Outputs "Zurich"
System.out.println(geocoder.getDescriptionForNumber(swissNumberProto, Locale.ENGLISH));
// Outputs "Zürich"
System.out.println(geocoder.getDescriptionForNumber(swissNumberProto, Locale.GERMAN));
// Outputs "Zurigo"
System.out.println(geocoder.getDescriptionForNumber(swissNumberProto, Locale.ITALIAN));
Caveat: We do not provide data about the current carrier of a phone number, only
the original carrier who is assigned the corresponding range. Read about number
portability.
PhoneNumber swissMobileNumber =
new PhoneNumber().setCountryCode(41).setNationalNumber(798765432L);
PhoneNumberToCarrierMapper carrierMapper = PhoneNumberToCarrierMapper.getInstance();
// Outputs "Swisscom"
System.out.println(carrierMapper.getNameForNumber(swissMobileNumber, Locale.ENGLISH));
More examples on how to use the library can be found in the unit
tests.
Several third-party ports of the phone number library are known to us. We share
them here in case they’re useful for developers.
However, we emphasize that these ports are by developers outside the
libphonenumber project. We do not evaluate their quality or influence their
maintenance processes.
Alternatives to our own versions:
Class#getResourcesAsStream
and asks that Android apps follow the AndroidAssetManager#open()
themselvesAssetManager#open()
, and may be depended on withoutTools based on libphonenumber metadata: