Java phone number format API
So, you have a database with millions of phone numbers with free-for-all formatting. Ie, the UI does not enforce any constraints and the users are typing in whatever they want. There must be a Java API to format these, right? Yeah, not so much.
For example, a phone number in the system might look like any of the following:
(555) 478-1123
555-478-1123
555.478.1123
5554781123
You want an API that given the country of US, would produce the value "+1 (555) 478-1123" for all these. Of course, there are countless variations of the examples, as well as the complication of international phone numbers, which each have their own validation rules.
Well, I don't have a drop-in solution for you. But faced with the above situation, I did come up with the beginnings of a Java API that does this. For now, I have implemented US and UK formatting. Download the API here.
PhoneNumberFactory phoneNumberFactory = new PhoneNumberFactory();
PhoneNumber phoneNumber = phoneNumberFactory.create(CountryCodes.US, "5554781123");
// phoneNumber.toString() == "+1 (555) 478-1123"
PhoneNumber ukPhoneNumber = phoneNumberFactory.create(CountryCodes.UK, "442088709929");
// phoneNumber.toString() == "+44 20 88 70 99 29"
You can define new countries by extending PhoneNumber, and implementing the logic to parse any string into country code, area code and a list of subscriber number groups. For example, "+1 (555) 478-1123" has a country code of "1", area code of "555" and a List of subscriber numbers ("478", "1123"). You can group subscriber numbers however you want, it's just a convenience for formatting.
You can can also define your own formatters. Don't like my US format? No problem!
public class MyPhoneFormat implements PhoneFormat {
public String format(PhoneNumber phoneNumber) {
String value = phoneNumber.getCountryCode()
+ " " + phoneNumber.getAreaCode() + getPostAreaCode(phoneNumber);
for (int i = 0; i < phoneNumber.getSubscriberNumbers().size(); i++)
value += phoneNumber.getSubscriberNumber(i);
return value.trim();
}
// US phone numbers are one long run of digits, UK has a space
private String getPostAreaCode(PhoneNumber phoneNumber) {
return phoneNumber.getCountryCode().equalsIgnoreCase(CountryCodes.UK) ? " ": "";
}
}
This would output phone numbers in either "1 5554789119" (US) or "44 20 88709929" (UK).