<p>What is the best way for converting phone numbers into international format (E.164) using Java?</p>

<p>Given a 'phone number' and a country id (let's say an ISO country code), I would like to convert it into a standard E.164 international format phone number.</p>

<p>I am sure I can do it by hand quite easily - but I would not be sure it would work correctly in all situations.</p>

<p>Which Java framework/library/utility would you recommend to accomplish this?</p>

<p>P.S. The 'phone number' could be anything identifiable by the general public - such as</p>

<pre><code>* (510) 786-0404
* 1-800-GOT-MILK
* +44-(0)800-7310658
</code></pre>

<p>that last one is my favourite - it is how some people write their number in the UK and means that you should either use the +44 or you should use the 0.</p>

<p>The E.164 format number should be all numeric, and use the full international country code (e.g.+44)</p>

Speaking from experience at writing this kind of thing, it's really difficult to do with 100% reliability.  I've written some Java code to do this that is reasonably good at processing the data we have but won't be applicable in every country.  Questions you need to ask are:
Are the character to number mappings consistent between countries?  The US uses a lot of this (eg 1800-GOT-MILK) but in Australia, as one example, its pretty rare.  What you'd need to do is ensure that you were doing the correct mapping for the country in question if it varies (it might not).  I don't know what countries that use different alphabets (eg Cyrilic in Russia and the former Eastern block countries) do;
You have to accept that your solution will not be 100% and you should not expect it to be.  You need to take a "best guess" approach.  For example, theres no real way of knowing that 132345 is a valid phone number in Australia, as is 1300 123 456 but that these are the only two patterns that are for 13xx numbers and they're not callable from overseas;
You also have to ask if you want to validate regions (area codes).  I believe the US uses a system where the second digit of the area code is a 1 or a 0.  This may have once been the case but I'm not sure if it still applies.  Whatever the case, many other countries will have other rules.  In Australia, the valid area codes for landlines and mobile (cell) phones are two digits (the first is 0).  08, 03 and 04 are all valid.  01 isn't.  How do you cater for that?  Do you want to?
Countries use different conventions no matter how many digits they're writing.  You have to decide if you want to accept something other than the "norm".  These are all common in Australia:
(02) 1234 5678
02 1234 5678
0411 123 123 (but I've never seen 04 1112 3456)
131 123
13 1123
131 123
1 300 123 123
1300 123 123
02-1234-5678
1300-234-234
+44 78 1234 1234
+44 (0)78 1234 1234
+44-78-1234-1234
+44-(0)78-1234-1234
0011 44 78 1234 1234 (0011 is the standard international dialling code)
(44) 078 1234 1234 (not common)
And thats just off the top of my head.  For one country.  In France, for example, its common the write the phone number in number pairs (12 34 56 78) and they pronounce it that way too: instead of:
un (one), deux (two), trois (three), ...
its
douze (twelve), trente-quatre (thirty four), ...
Do you want to cater for that level of cultural difference?  I would assume not but the question is worth considering just in case you make your rules too strict.
Also some people may append extension numbers on phone numbers, possibly with "ext" or similar abbreviation.  Do you want to cater for that?
Sorry, no code here.  Just a list of questions to ask yourself and issues to consider.  As others have said, a series of regular expressions can do much of the above but ultimately phone number fields are (mostly) free form text at the end of the day.