From 3c39b530ee16693c57c06cf80e09fd66375265b1 Mon Sep 17 00:00:00 2001 From: Lara Scheidegger Date: Fri, 15 Oct 2010 11:39:34 +0000 Subject: [PATCH] Small feature changes, metadata updates. --- java/release_notes.txt | 13 +- .../phonenumbers/BuildMetadataFromXml.java | 13 +- .../phonenumbers/src/PhoneNumberMetaData.xml | 421 ++++++++++++------ .../test/PhoneNumberMetaDataForTesting.xml | 1 - .../i18n/phonenumbers/PhoneNumberUtil.java | 32 +- .../google/i18n/phonenumbers/Phonenumber.java | 17 + .../data/PhoneNumberMetadataProto_AF | Bin 291 -> 295 bytes .../data/PhoneNumberMetadataProto_BF | Bin 341 -> 351 bytes .../data/PhoneNumberMetadataProto_BO | Bin 134 -> 492 bytes .../data/PhoneNumberMetadataProto_ES | Bin 351 -> 358 bytes .../data/PhoneNumberMetadataProto_GB | Bin 1755 -> 2628 bytes .../data/PhoneNumberMetadataProto_GG | Bin 395 -> 489 bytes .../data/PhoneNumberMetadataProto_GN | Bin 353 -> 362 bytes .../data/PhoneNumberMetadataProto_IM | Bin 388 -> 449 bytes .../data/PhoneNumberMetadataProto_IS | Bin 551 -> 629 bytes .../data/PhoneNumberMetadataProto_JE | Bin 402 -> 522 bytes .../data/PhoneNumberMetadataProto_JP | Bin 4357 -> 4357 bytes .../data/PhoneNumberMetadataProto_KR | Bin 1299 -> 1459 bytes .../data/PhoneNumberMetadataProto_KW | Bin 333 -> 388 bytes .../data/PhoneNumberMetadataProto_PE | Bin 534 -> 391 bytes .../data/PhoneNumberMetadataProto_PT | Bin 419 -> 439 bytes .../data/PhoneNumberMetadataProto_RU | Bin 541 -> 541 bytes .../data/PhoneNumberMetadataProto_SE | Bin 1560 -> 1581 bytes .../data/PhoneNumberMetadataProto_TT | Bin 430 -> 444 bytes .../data/PhoneNumberMetadataProto_ZW | Bin 1378 -> 1531 bytes .../phonenumbers/PhoneNumberUtilTest.java | 258 ++++------- 26 files changed, 441 insertions(+), 314 deletions(-) diff --git a/java/release_notes.txt b/java/release_notes.txt index c51499dd4..a3c9d4239 100644 --- a/java/release_notes.txt +++ b/java/release_notes.txt @@ -1,3 +1,14 @@ +October 15th, 2010 +* Code improvements: + - Allowed parsing of numbers that start with "++" or a full-width "+" symbol + - Allowed reg-exs for national and possible number patterns to have white space in them in the source XML file + - Added a more useful toString method for the phone number proto class +* Metadata changes: + - Updates to existing countries: AF, BF, BO, ES, GB, GG, IM, IS, JE, JE, JP, KR, PE, PT, RU, SE, + TT, ZW +* Bug fixes: + - Parsing empty strings with invalid region codes no longer throws a null pointer exception + September 4th, 2010 * Code improvement: - Added new phone number type: pager @@ -49,4 +60,4 @@ July 30th, 2010 * Code improvement - China local number formatting for AsYouTypeFormatter - - improve extension parsing to handle number in the form of +1 (645) 123 1234 ext. 910# \ No newline at end of file + - improve extension parsing to handle number in the form of +1 (645) 123 1234 ext. 910# diff --git a/java/resources/com/google/i18n/phonenumbers/BuildMetadataFromXml.java b/java/resources/com/google/i18n/phonenumbers/BuildMetadataFromXml.java index a33e11221..aaf238655 100644 --- a/java/resources/com/google/i18n/phonenumbers/BuildMetadataFromXml.java +++ b/java/resources/com/google/i18n/phonenumbers/BuildMetadataFromXml.java @@ -96,6 +96,15 @@ public class BuildMetadataFromXml { } private static String validateRE(String regex) { + return validateRE(regex, false); + } + + private static String validateRE(String regex, boolean removeWhitespace) { + // Removes all the whitespace and newline from the regexp. Not using pattern compile options to + // make it work across programming languages. + if (removeWhitespace) { + regex = regex.replaceAll("\\s", ""); + } Pattern.compile(regex); // return regex itself if it is of correct regex syntax // i.e. compile did not fail with a PatternSyntaxException. @@ -286,13 +295,13 @@ public class BuildMetadataFromXml { NodeList possiblePattern = element.getElementsByTagName("possibleNumberPattern"); if (possiblePattern.getLength() > 0) { numberDesc.setPossibleNumberPattern( - validateRE(possiblePattern.item(0).getFirstChild().getNodeValue())); + validateRE(possiblePattern.item(0).getFirstChild().getNodeValue(), true)); } NodeList validPattern = element.getElementsByTagName("nationalNumberPattern"); if (validPattern.getLength() > 0) { numberDesc.setNationalNumberPattern( - validateRE(validPattern.item(0).getFirstChild().getNodeValue())); + validateRE(validPattern.item(0).getFirstChild().getNodeValue(), true)); } if (!liteBuild) { diff --git a/java/resources/com/google/i18n/phonenumbers/src/PhoneNumberMetaData.xml b/java/resources/com/google/i18n/phonenumbers/src/PhoneNumberMetaData.xml index d94e95f8e..15af7c9c8 100644 --- a/java/resources/com/google/i18n/phonenumbers/src/PhoneNumberMetaData.xml +++ b/java/resources/com/google/i18n/phonenumbers/src/PhoneNumberMetaData.xml @@ -36,7 +36,7 @@ - + @@ -184,7 +184,7 @@ [2-7]\d{8} - \d{9} + \d{7,9} (?:[25][0-8]|[34][0-4]|6[0-5])[2-9]\d{6} @@ -192,6 +192,7 @@ 7[057-9]\d{7} + \d{9} 701234567 @@ -967,9 +968,9 @@ - - $1 $2 $3 $4 - + + $1 $2 $3 $4 + [2457]\d{7} @@ -984,7 +985,7 @@ - 7(?:[024-6]\d|1[0-489]|8[013-9]|90)\d{5} + 7(?:[024-6]\d|1[0-489]|3[01]|8[013-9]|9[012])\d{5} 70123456 @@ -1215,9 +1216,66 @@ - - + + + + + + + + [234] + $1 $2 + + + [67] + $1 + + + + [23467]\d{7} + \d{7,8} + + + + (?: + 2(?: + 2\d{2} + | + 5(?:11|[258]\d|9[67]) + | + 6(?:12|2\d|9[34]) + | + 8(?:2[34]|39|62) + ) + | + 3(?: + 3\d{2} + | + 4(?:6\d|8[24]) + | + 8(?:25|42|5[257]|86|9[25]) + | + 9(?:2\d|3[234]|4[248]|5[24]|6[2-6]|7\d) + ) + | + 4(?: + 4\d{2} + | + 6(?:11|[24689]\d|72) + ) + )\d{4} + + \d{7,8} + 22123456 + + + [67]\d{7} + \d{8} + 71234567 + @@ -1234,7 +1292,7 @@ code.--> [1-9][1-9] $1 $2-$3 @@ -2409,7 +2467,7 @@ - + @@ -2440,8 +2498,9 @@ 90[12]\d{6} 901123456 + - 70\d{7} + (?:51|70)\d{7} 701234567 @@ -2621,45 +2680,47 @@ - + + + mainCountryForCode="true"> + - [23]|5[56]|9[018] + 2|5[56]|7[06] $1 $2 $3 - - 1(?:1|\d1)|500 + + + 1(?:1|\d1)|3|9[018] $1 $2 $3 - + 1(?:38|5[23]|69|76|94) 1(?:387|5(?:24|39)|697|768|946) - 1(?:3873|5(?:242|39[4-6])|697[347]|768[347]|9467) + 1(?:3873|5(?:242|39[456])|697[347]|768[347]|9467) $1 $2 - + + 1 $1 $2 - - - 7[1-9] - $1 $2 $3 - - - 70 + + + 7[1-5789] $1 $2 - + 800 8001 @@ -2668,47 +2729,95 @@ 8001111 $1 $2 - - 8(?:0|4[3-5]|7[0-3]) + + + 845 + 8454 + 84546 + 845464 + $1 $2 $3 + + + + 8(?:4[2-5]|7[0-3]) $1 $2 $3 + + + 80 + $1 $2 $3 + + + + [58]00 + $1 $2 + \d{7,10} - \d{6,10} + \d{4,10} - 1(?:1[3-8]|[2-69]1)\d{7}|1(?:2(?:0[024-9]|2[3-9]|3[3-79]|4[1-689]|[58][02-9]|6[0-47-9]|7[013-9]|8[02-9]|9[0-9])|3(?:0\d|[25][02-9]|3[02-579]|4[0-56-9]|[68][0-46-9]|7[1-35-79]|9[24578])|4(?:0[03-9]|2[02-57-9]|[37]\d|4[02-69]|5[0-8]|[69][0-79]|8[02-9])|5(?:0[1-35-9]|2[024-9]|3[015689]|4[02-9]|[57][03-9]|6\d|8[0-68]|9[0-57-9])|6(?:0[034689]|2[0-35689]|3[13-9]|4[1-467]|5[0-69]|6[13-9]|7[0-8]|8[013-9]|9[0-24578])|7(?:0[0246-9]|2\d|3[0236-8]|4[03-9]|5[0-46-9]|6[13-9]|7[0-35-9]|8[024-9]|9[02-9])|8(?:0[35-9]|2[1-9]|3[02-578]|4[0-578]|5[124-9]|6[2-69]|7\d|8[2-9]|9[02569])|9(?:0[02-589]|2[02-689]|3[1-57-9]|4[2-9]|5[0-579]|6[2-47-9]|7[0-24578]|8\d|9[2-57]))\d{5,6}|(?:2[03489]|3[0347]|55)\d{8} + + 1(?:1[3-8]|[2-69]1)\d{7}| + 1(?:2(?:0[024-9]|2[3-9]|3[3-79]|4[1-689]|[58][02-9]|6[0-4789]|7[013-9]|9\d)| + 3(?:0\d|[25][02-9]|3[02-579]|[468][0-46-9]|7[1235679]|9[24578])| + 4(?:0[03-9]|2[02-5789]|[37]\d|4[02-69]|5[0-8]|[69][0-79]|8[02-5789])| + 5(?:0[1235-9]|2[024-9]|3[015689]|4[02-9]|5[03-9]|6\d|7[0-35-9]|8[0-468]|9[0-5789])| + 6(?:0[034689]|2[0-35689]|3[013-9]|4[1-467]|5[0-69]|6[13-9]|7[0-8]|8[013-9]|9[0124578])| + 7(?:0[0246-9]|2\d|3[023678]|4[03-9]|5[0-46-9]|6[013-9]|7[0-35-9]|8[024-9]|9[02-9])| + 8(?:0[35-9]|2[1-5789]|3[02-578]|4[0-578]|5[124-9]|6[2-69]|7\d|8[02-9]|9[02569])| + 9(?:0[02-589]|2[02-689]|3[1-5789]|4[2-9]|5[0-579]|6[234789]|7[0124578]|8\d|9[2-57]))\d{6}| + 1(?:2(?:0(?:46[1-4]|87[2-9])|545[1-79]|76(?:2\d|3[1-8]|6[1-6])|9(?:7(?:2[0-4]|3[2-5])|8(?:2[2-8]|7[0-4789]|8[345])))| + 3(?:638[2-5]|647[23]|8(?:47[04-9]|64[015789]))| + 4(?:044[1-7]|20(?:2[23]|8\d)|6(?:0(?:30|5[2-57]|6[1-8]|7[2-8])|140)|8(?:052|87[123]))| + 5(?:24(?:3[2-79]|6\d)|276\d|6(?:26[06-9]|686))| + 6(?:06(?:4\d|7[4-79])|295[567]|35[34]\d|47(?:24|61)|59(?:5[08]|6[67]|74)|955[0-4])| + 7(?:26(?:6[13-9]|7[0-7])|442\d|50(?:2[0-3]|[3-68]2|76))| + 8(?:27[56]\d|37(?:5[2-5]|8[239])|84(?:3[2-58]))| + 9(?:0(?:0(?:6[1-8]|85)|52\d)|3583|4(?:66[1-8]|9(?:2[01]|81))|63(?:23|3[1-4])|9561))\d{3}| + 176888[234678]\d{2}| + 16977[23]\d{3}| + 2(?:0[01378]|3[0189]|4[017]|8[0-46-9]|9[012])\d{7}| + (?:3[0347]|55)\d{8} 1212345678 - - 7(?:4[0-26]\d|5(?:[013-9]\d|2[0-35-9])|7(?:0[1-9]|8[02-9]|9[0-689]|[1-7]\d)|8(?:[014-9]\d|[23][0-8])|9(?:1[02-9]|2[0135-9]|3[0-689]|[04-9]\d))\d{6} + + 7(?:[1-4]\d\d|5(?:0[0-8]|[13-9]\d|2[0-35-9])|7(?:0[1-9]|[1-7]\d|8[02-9]|9[0-689])|8(?:[014-9]\d|[23][0-8])|9(?:[04-9]\d|1[02-9]|2[0135-9]|3[0-689]))\d{6} \d{10} 7400123456 + + + 76(?:0[012]|2[356]|4[0134]|5[49]|6[0-369]|77|81|9[39])\d{6} + \d{10} + 7640123456 + + http://en.wikipedia.org/wiki/Non-geographical_telephone_numbers_in_the_UK --> - 80(?:01111|\d{7,8})|500\d{6} + + 80(?:0(?:1111|\d{6,7})|8\d{7})|500\d{6} \d{7,10} - 8012345678 + 8001234567 - - (?:9[018]\d|87[1-3])\d{7} + + (?:87[123]|9(?:[01]\d|8[0-3]))\d{7} \d{10} 9012345678 - - 8(?:4[3-5]|70)\d{7} - \d{10} + + 8(?:4(?:5464\d|[2-5]\d{7})|70\d{7}) + \d{7,10} 8431234567 @@ -2812,17 +2921,17 @@ - + - [157-9]\d{6,9} + [15789]\d{6,9} \d{6,10} + 1481\d{6} - 1481223456 + 1481456789 7(?:781|839|911)\d{6} @@ -2830,13 +2939,18 @@ 7781123456 + + 76(?:0[012]|2[356]|4[0134]|5[49]|6[0-369]|77|81|9[39])\d{6} + \d{10} + 7640123456 + - 80(?:01111|\d{7,8})|500\d{6} + 80(?:0(?:1111|\d{6,7})|8\d{7})|500\d{6} \d{7,10} 8001234567 - (?:9[018]\d|87[1-3])\d{7} + (?:87[123]|9(?:[01]\d|8[0-3]))\d{7} \d{10} 9012345678 @@ -2950,7 +3064,7 @@ - [367]\d{7} + [3567]\d{7} \d{8} @@ -2961,7 +3075,7 @@ - 6(?:0(?:2\d|3[3467]|5[2457-9])|[2457]\d{2}|3(?:[14]0|35))\d{4} + 55\d{6}|6(?:0(?:2\d|3[3467]|5[2457-9])|[2457]\d{2}|3(?:[14]0|35))\d{4} 60201234 @@ -3579,36 +3693,42 @@ - + - [157-9]\d{6,9} + [15789]\d{6,9} \d{6,10} + 1624\d{6} - 1624223456 + 1624456789 - 7[69]24\d{6} - 7624123456 + 7[569]24\d{6} + \d{10} + 7924123456 + + 7624\d{6} + \d{10} + 7624123456 + - 80(?:01111|\d{7,8})|500\d{6} + 80(?:0(?:1111|\d{6,7})|8\d{7})|500\d{6} \d{7,10} 8001234567 - (?:9[018]\d|87[1-3])\d{7} + (?:87[123]|9(?:[01]\d|8[0-3]))\d{7} \d{10} 9012345678 - 8(?:4[3-5]|70)\d{7} - \d{10} + 8(?:4(?:5464\d|[2-5]\d{7})|70\d{7}) + \d{7,10} 8431234567 @@ -3819,32 +3939,41 @@ + [4-9] $1 $2 + + 3 + $1 $2 $3 + - [4-9]\d{6} - \d{7} + [4-9]\d{6}|38\d{7} + \d{7,9} (?:4(?:1[0-245]|2[0-7]|[37][0-8]|4[0245]|5[0-356]|6\d|8[0-46-8]|9[013-79])|5(?:05|[156]\d|2[02578]|3[013-6]|4[03-6]|7[0-2578]|8[0-25-9]|9[013-689])|87[23])\d{4} + \d{7} 4101234 - (?:6(?:1[014-8]|2[0-8]|3[0-27-9]|4[0-29]|5[029]|[67][0-69]|[89]\d)|7(?:5[057]|7[0-7])|8(?:2[0-5]|[469]\d|5[1-9]))\d{4} + 38[59]\d{6}|(?:6(?:1[014-8]|2[0-8]|3[0-27-9]|4[0-29]|5[029]|[67][0-69]|[89]\d)|7(?:5[057]|7[0-7])|8(?:2[0-5]|[469]\d|5[1-9]))\d{4} 6101234 800\d{4} + \d{7} 8001234 90\d{5} + \d{7} 9011234 49[013-79]\d{4} + \d{7} 4931234 @@ -3935,44 +4064,51 @@ - + - [157-9]\d{6,9} + [15789]\d{6,9} \d{6,10} + 1534\d{6} - 1534223456 + 1534456789 - 7(?:7(?:00|97)|829|937)\d{6} + 7(?:509|7(?:00|97)|829|937)\d{6} \d{10} 7797123456 + + 76(?:0[012]|2[356]|4[0134]|5[49]|6[0-369]|77|81|9[39])\d{6} + \d{10} + 7640123456 + - 80(?:01111|\d{7,8})|500\d{6} + 80(?:0(?:1111|\d{6,7})|8\d{7})|500\d{6} \d{7,10} 8001234567 - (?:9[018]\d|87[1-3])\d{7} + (?:87[123]|9(?:[01]\d|8[0-3]))\d{7} \d{10} 9012345678 - 8(?:4[3-5]|70)\d{7} - \d{10} + 8(?:4(?:5464\d|[2-5]\d{7})|70\d{7}) + \d{7,10} 8431234567 + - 70\d{8} + 701511\d{4} \d{10} - 7012345678 + 7015115678 + 56\d{8} \d{10} @@ -4078,7 +4214,7 @@ (?:12|99)0 - $1 $2 $3 + $1-$2-$3 [57-9]0 - $1 $2 $3 + $1-$2-$3 + + 1(?:5[46-9]|6[04678]) + 1(?:5(?:44|66|77|88|99)|6(?:00|44|6[16]|70|88)) + $1-$2 + [1-79]\d{3,9}|8\d{8} \d{4,10} - (?:2|[34][1-3]|5[1-5]|6[1-4])(?:1\d{2,3}|[2-9]\d{6,7}) + + 1(?:5(?:44|66|77|88|99)|6(?:00|44|6[16]|70|88))\d{4}|(?:2|[34][1-3]|5[1-5]|6[1-4])(?:1\d{2,3}|[2-9]\d{6,7}) \d{4,10} 22123456 @@ -4485,7 +4629,7 @@ \d{7,8} - (?:18|2[2-5]\d)\d{5} + (?:18\d|2(?:[23]\d{2}|4[1-35-9]\d|5(?:0[034]|[2-46]\d|5[1-3]|7[1-7])))\d{4} \d{7,8} 22345678 @@ -5680,7 +5824,8 @@ 20201234 - + 9[03467]\d{6} 93123456 @@ -6049,39 +6194,35 @@ nationalPrefix="0" nationalPrefixFormattingRule="($FG)" preferredExtnPrefix=" Anexo "> - - 19 - $1 $2 $3 - - - 1[0-8] + + 1 $1 $2 - [4-8]\d[0-8] + [4-8] $1 $2 - - [4-8]\d9 + + + 9 $1 $2 $3 - - [146-8]\d{7,10}|5\d{7}(?:\d{3})? - \d{7,11} + [14-9]\d{7,8} + \d{6,9} - (?:1\d{2}|4[1-4]|5[1-46]|6[1-7]|7[2-46]|8[2-4])\d{6} - \d{7,9} - 112345678 + (?:1\d|4[1-4]|5[1-46]|6[1-7]|7[2-46]|8[2-4])\d{6} + \d{6,8} + 11234567 - (?:1|4[1-4]|5[1-46]|6[1-7]|7[2-46]|8[2-4])9\d{8} - \d{10,11} - 54951234567 + 9\d{8} + \d{9} + 912345678 @@ -6419,6 +6560,10 @@ 71\d{7} 712345678 + + 808\d{6} + 808123456 + 30\d{7} 301234567 @@ -6620,8 +6765,8 @@ - - [3489] + + [34689] $1 $2-$3-$4 @@ -6819,8 +6964,8 @@ 1[2457]|2[2457-9]|3[0247-9]|4[1357-9]|5[0-35-9]|6[124-9]|9(?:[125-8]|3[0-5]|4[0-3]) $1 $2 $3 - - 7[02-46] + + 7[02-467] $1 $2 $3 $4 @@ -6856,6 +7001,11 @@ \d{10} 9001234567 + + 77\d{7} + \d{9} + 771234567 + @@ -7546,7 +7696,7 @@ \d{7,10} - 868(?:22[1-4]|6(?:1[4-6]|[2-6]\d|7[0-79]|9[0-8])|82[12])\d{4} + 868(?:2(?:01|2[1-4])|6(?:1[4-6]|2[1-9]|[3-6]\d|7[0-79]|9[0-8])|82[12])\d{4} 8682211234 @@ -8261,7 +8411,7 @@ - + @@ -8271,7 +8421,7 @@ $1 $2 $3 - + [19]1|7 $1 $2 $3 @@ -8304,22 +8454,45 @@ 258[23]|5483 $1 $2 $3 + + + 8 + $1 $2 + - (?:[19]1|23)\d{3,8}|[1-69]\d{4,8} + + + 2(?:[012457-9]\d{3,8}|6\d{3,6})| + [13-79]\d{4,8}| + 86\d{8} + \d{3,10} - (?:1[346-8]|2(?:0[45]|2[28]|48|58[23]|[69]|7[2-46-8]|8[13-9])|3(?:08?|17?|3[78]|[45]|7[1569]|8[379])|5(?:18|483|[57-9])|6(?:37?|[459]|88)|848)\d{3,6}|(?:2(?:27|5|7[159]|82)|39|5[346]|6[16-8])\d{4,6}|2(?:0|70)\d{5,6}|(?:9[2-8]|4\d)\d{4,7} + + + (?:1[3-9]|2(?:0[45]|[16]|2[28]|[49]8?|58[23]|7[246]|8[1346-9])|3(?:08?|17?|3[78]|[2456]|7[1569]|8[379])|5(?:[07-9]|1[78]|483|5(?:7?|8))|6(?:0|28|37?|[45][68][78]|98?)|848)\d{3,6}| + (?:2(?:27|5|7[135789]|8[25])|3[39]|5[1-46]|6[126-8])\d{4,6}| + 2(?:0|70)\d{5,6}| + (?:4\d|9[2-8])\d{4,7} + \d{3,10} 1312345 - (?:[19]1|73)\d{3,8} - \d{3,10} - 11123456 + (?:[19]1|7[13])\d{6,7} + \d{8,9} + 911234567 + + 86(?:1[12]|22|30|44|8[367]|99)\d{6} + \d{10} + 8686123456 + diff --git a/java/resources/com/google/i18n/phonenumbers/test/PhoneNumberMetaDataForTesting.xml b/java/resources/com/google/i18n/phonenumbers/test/PhoneNumberMetaDataForTesting.xml index 8604fa552..6560b6896 100644 --- a/java/resources/com/google/i18n/phonenumbers/test/PhoneNumberMetaDataForTesting.xml +++ b/java/resources/com/google/i18n/phonenumbers/test/PhoneNumberMetaDataForTesting.xml @@ -29,7 +29,6 @@ - diff --git a/java/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java b/java/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java index b51ac673a..cc71f2fec 100644 --- a/java/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java +++ b/java/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java @@ -198,6 +198,7 @@ public class PhoneNumberUtil { Arrays.toString(ALPHA_MAPPINGS.keySet().toArray()).replaceAll(", ", "") + Arrays.toString(ALPHA_MAPPINGS.keySet().toArray()).toLowerCase().replaceAll(", ", ""); private static final String PLUS_CHARS = "+\uFF0B"; + private static final Pattern PLUS_CHARS_PATTERN = Pattern.compile("[" + PLUS_CHARS + "]+"); private static final Pattern CAPTURING_DIGIT_PATTERN = Pattern.compile("([" + VALID_DIGITS + "])"); @@ -232,11 +233,12 @@ public class PhoneNumberUtil { // least three leading digits, and only valid punctuation, alpha characters and // digits in the phone number. Does not include extension data. // The symbol 'x' is allowed here as valid punctuation since it is often used as a placeholder for - // carrier codes, for example in Brazilian phone numbers. + // carrier codes, for example in Brazilian phone numbers. We also allow multiple "+" characters at + // the start. // Corresponds to the following: - // plus_sign?([punctuation]*[digits]){3,}([punctuation]|[digits]|[alpha])* + // plus_sign*([punctuation]*[digits]){3,}([punctuation]|[digits]|[alpha])* private static final String VALID_PHONE_NUMBER = - "[" + PLUS_CHARS + "]?(?:[" + VALID_PUNCTUATION + "]*[" + VALID_DIGITS + "]){3,}[" + + "[" + PLUS_CHARS + "]*(?:[" + VALID_PUNCTUATION + "]*[" + VALID_DIGITS + "]){3,}[" + VALID_ALPHA + VALID_PUNCTUATION + VALID_DIGITS + "]*"; // Default extension prefix to use when formatting. This will be put in front of any extension @@ -1442,17 +1444,11 @@ public class PhoneNumberUtil { } /** - * Gets an AsYouTypeFormatter for the specific country. Note this function doesn't attempt to - * figure out the types of phone number being entered on the fly due to performance reasons. - * Instead, it tries to apply a standard format to all types of phone numbers. For countries - * where different types of phone numbers follow different formats, the formatter returned - * will do no formatting but output exactly what is fed into the inputDigit method. + * Gets an AsYouTypeFormatter for the specific country. * - * If the type of the phone number being entered is known beforehand, use - * getAsYouTypeFormatterByType instead. + * @param regionCode the ISO 3166-1 two-letter country code that denotes the + * country/region where the phone number is being entered * - * @param regionCode the ISO 3166-1 two-letter country code that denotes - * the country/region where the phone number is being entered * @return an AsYouTypeFormatter object, which could be used to format phone numbers in the * specific country "as you type" */ @@ -1622,8 +1618,10 @@ public class PhoneNumberUtil { if (number.length() == 0) { return CountryCodeSource.FROM_DEFAULT_COUNTRY; } - if (number.charAt(0) == PLUS_SIGN) { - number.deleteCharAt(0); + // Check to see if the number begins with one or more plus signs. + Matcher m = PLUS_CHARS_PATTERN.matcher(number); + if (m.lookingAt()) { + number.delete(0, m.end()); // Can now normalize the rest of the number since we've consumed the "+" sign at the start. normalize(number); return CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN; @@ -1747,7 +1745,7 @@ public class PhoneNumberUtil { public void parse(String numberToParse, String defaultCountry, PhoneNumber phoneNumber) throws NumberParseException { if (!isValidRegionCode(defaultCountry)) { - if (numberToParse.charAt(0) != PLUS_SIGN) { + if (numberToParse.length() > 0 && numberToParse.charAt(0) != PLUS_SIGN) { throw new NumberParseException(NumberParseException.ErrorType.INVALID_COUNTRY_CODE, "Missing or invalid default country."); } @@ -1784,7 +1782,7 @@ public class PhoneNumberUtil { PhoneNumber phoneNumber) throws NumberParseException { if (!isValidRegionCode(defaultCountry)) { - if (numberToParse.charAt(0) != PLUS_SIGN) { + if (numberToParse.length() > 0 && numberToParse.charAt(0) != PLUS_SIGN) { throw new NumberParseException(NumberParseException.ErrorType.INVALID_COUNTRY_CODE, "Missing or invalid default country."); } @@ -1798,7 +1796,7 @@ public class PhoneNumberUtil { * isNumberMatch(). */ private void parseHelper(String numberToParse, String defaultCountry, - Boolean keepRawInput, PhoneNumber phoneNumber) + boolean keepRawInput, PhoneNumber phoneNumber) throws NumberParseException { // Extract a possible number from the string passed in (this strips leading characters that // could not be the start of a phone number.) diff --git a/java/src/com/google/i18n/phonenumbers/Phonenumber.java b/java/src/com/google/i18n/phonenumbers/Phonenumber.java index 82dec43fb..42a8dcdd9 100644 --- a/java/src/com/google/i18n/phonenumbers/Phonenumber.java +++ b/java/src/com/google/i18n/phonenumbers/Phonenumber.java @@ -178,5 +178,22 @@ public final class Phonenumber { extension_.equals(other.extension_) && italianLeadingZero_ == other.italianLeadingZero_ && rawInput_.equals(other.rawInput_) && countryCodeSource_ == other.countryCodeSource_); } + + @Override + public String toString() { + StringBuffer outputString = new StringBuffer(); + outputString.append("Country Code: ").append(countryCode_); + outputString.append(" National Number: ").append(nationalNumber_); + if (hasItalianLeadingZero() && getItalianLeadingZero()) { + outputString.append(" Leading Zero: true"); + } + if (hasExtension()) { + outputString.append(" Extension: ").append(extension_); + } + if (hasCountryCodeSource()) { + outputString.append(" Country Code Source: ").append(countryCodeSource_); + } + return outputString.toString(); + } } } diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AF b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AF index cc68781c9927a6017c389782b6007d930757d27b..d5c398595184e33d117557c8018bd331075bdcf0 100644 GIT binary patch delta 53 zcmZ3?w46zK&07Z6Dh38dIR+rX$jHDIZKP`+8CMp`TL0MsE0Xq*2 A+yDRo delta 49 ycmZ3^w3tb8&07Z6Dh38dDFz_H$jHDIZKP`+8 delta 37 tcmcc5bd`y7&07Z6Dh38dpNX91j2aUg#knn_4GfKSEn{me4JNML1OU=;3se9A diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO index 04d2f92e28effcc0ec00b8a6d8df548be996a803..577f50510d826182dc6e4d2e9f47ea8a255044f9 100644 GIT binary patch literal 492 zcmbVJOHRZv40S51DFSf@7F{$FNR9I?n-Lsf<^Y}U<`m%Gh@)@|*4%;T6h^FB)OMbq zU!I%yFKSgkn(amzvb1?PV+-q(W8%H|HS$M<5eO`=Vazsz?Nyol$E3? z3phZ008(^BOYxH=wpKh4zlj8t3EVRCg&QTXMCj&4N`eeW$V@5&rdNZD1Pqi#X*i^r zAJZcFbcVW0hE2ViQHvp!Nlj*4Z_x{XRx{KwJBY@FC9ic2Fm(AAxgd9WYiIPE!*dP# zL;hV;^Kv9=j?|6g;NW^shRlet`#s}1sG+-|Zfl3?$Wq(8`=0fwsI48NCDF}rv2Cg8 NU1eM;_Co+b^bG@LWsm>> literal 134 zcmZ4UmVvdrfq{X6kr70|Fe3w#pCgz6Ns!HEU~=+jU|{lR;4m;Sj5g3Ujs;r5XaFOC Hwm|>@vWyI( diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES index 63dacfd90c635225aadf924d8fa23087d2599afd..85d0e22b72a9f89f5483d4cabe70873cf9273255 100644 GIT binary patch delta 31 ncmcc5^o)sf&07Z6Dh39|*omBHxcD^etxOGT%ndXr-e?B^oR100 delta 24 gcmaFHbf1ZH&07Z6Dh39|u!)>!nAyz@Cf;uc0A%F|5C8xG diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB index 1a8b8b8dc55ea3ccabbf072f8f2e592df6630439..6457a19d8af37f7d158580641c844e23ddb45ada 100644 GIT binary patch literal 2628 zcmZ{mTW%aT5Jfq%B|Adi5C2Ah1!Nk~0L?c$`3R7oETT1kT0{`H7Lq+=YuQ82Epj|# z0Tv*UZWeFds=8J5zyG=Gzny#S_}T4t?(O5#hx*{>=e|waa&TS!{`X(~8V~Kbt>I9X zqn~8@yy+nDJFjy{hvm2htXLvTWlgI;l*VSw?TC%e$~qrX)yKNd-prTBr)i7Ad3?e{ zKAA>c$pTta5x^l8LDbcUn2QdUHKbhIaoSSnVSu4uG|#afK~4Gs^DTp-IM}ljMEhtw zZP`GC-lG{|LBwYZ#Be%{c`9HN$Dv;U3W~rlY@oHks|;Rz=N`F=tN|<5eooTQkRQ4Bn!#0tnYLz-r_g;5z+kmC z*uKf+-^yLO9JY#kOC#h3mx*H9mO=55N90sMyGXp29Eh4E#M8vTZcrJs)13%1V5{6RqlIgyb>wPGKeXEDh4;Bz(@RnJ(kLRC(_oKIGnmb zOKfJmm4v&9S24i4r-Q`%UiP8Kq}o#1Fq=EOA+eh%_!MUZX`vZ8^DF|>=F>bXl7nJH zldv#>21#9{rCtO$ZJ|ns7A=*w9x1J0ZhrJ9abDM?E0`~NrG1Dz6W#IAh5$WcIZ0db z_)+nwi)BrwHBr!PiUPqbg?lMg>a(S!eCHl6Qm4}*RX>KUijUG2D$doDQ79I^G#;X9 z@Dv*Z1ACJYR>D*Dpwlw!a6& z8}s%b#ZORF;7Lj2Ukp;k*!!PveOy>~%6P^apQb5JFIvtztLGO&QX}V5r~&pwc9rto z_l_63@9hrjj?f!y=WZZxFTrh1GZBh3lz(Zegnm6g8%E`!KI502);u%9>CjIeliPMe zs6f2u^3b!D7Y^d8j7s4Kbm@N?-YsSCt=~Y%sYue+jKg=8Ye>BCo#IG2zTcRQigFR( zCH|XCBU#nX2B_v-v)^o{P$r75*A69{CTJr%IjJEPh^Bb0$Pj%<*MKT1XV6;G@awMr z{DTMh!ClR>+qvDmb60nNX`^@9-MXLl+z!u^mh^FPZ}0uxeYm@i8139w0rw)qEGoyH zdo|zt9Vd1<_FH2C7RQ3!HD|JrC~>Y}~c^$Hgo6PWNNeD5K%a zLa%R2n%vL*dmU42iwjM;RE`_xWpaKP#9g@$OAu zFPwh8Zz)fEqTD0YPc!}+q?AEQIf2CA0+N<=X7O&XrW$qsZ0WwYhUjmS9xYnv4Dlm@ d;9I5pEWlMmaOX_vKWZcR7n!>0M`vTx-T%hdX~qBm literal 1755 zcmaJ>OKuZE5bbf|B#ID9L3 z)f0~#2}^djr>kDS_o`}s{Z;E9N}Vcvx~@|f_YaS0XY^jSk+wKk{WjZAA5C#Xo@%i} z94FIL=)Tf{#a9hM2J_Ay0^*vsm=t6YWybhQo6^8gVpEeRTwR z|A5QFoaHDa2&NuFr2G;IbnyHq;VKvS*0ES0QU;J0ZhVOq1Wt5m0=%auP*Vd?NE`Op z(It&hUjrjBG#(QM>jWJWSQnUIjoH$`9r0LrIIk^-siYiwjZ=K%_QdFzVUKyLY% zgb(qG?Epp*KVV8AfzA?>pjvUk;%c(WMM?lSCPez=e2ECRno^boP^wQ~Gb75W1tkPE z_XQGqunEP86;WEECRWWQCa3@beH|OSAy5}^31-P+3pjELQRMOx+*5lrl{Et!RYk!95Oc`DNlN^IHgN@V#RN&?-{z+BX1~Hc9 zFZ+|}!xicv@e0{wAhL^f)IijEB;1Ij1Zu=i&}{RdC56>Q&^-ffp1jNCwHCS{`#x&` zX@gItk=x}xdQxLJ9w}=vv6s1JvB-DGLKRFVTA62Kl9^pzHMSJI1Xh1I?-do_V|oL| zQ$Nqh-Zd*h?mQ6>GJC;($>Ka<6pjKyT-0Lq?Q^H_gZsaJ!CPpjR$8l0bsCTFzSD+Y zPU=Fv-U7+)ds_U{qAoV(Ze#B@4ndu|rUIZdL*&7O`c9qbjp=auhBBRG&dUx+M-VUh zT?elX`+Ug1qWsWq-eIHGd^ey^)GcMXjH`)29BYbo^u78Z&l7i<_0^4d4U7rL8RxNA zrUkebVG&aN5Ya)1E8NovmJKpee_(XIH3vx^6S1HK=b(Dle!InR9*ch_{fydVTv&Fs z&~j22!&Y-guiFQM5J2*RMp@GPFe*1|iO2_*T# z3op4<->P~2*yO?(|1c_?vssiDd~Qr_tOFnNQO#FgtPi`Ak^=kT>NYTT=!qad+r^S3 z4^b+eFc3!}Q$L`OVyjb^-}loVT(KZQB~(#cm(b9pO+p(@Na)J4BLF}zF+?3wS5A$b S)zqaRn1VB8q3O5BnYVupoifJ& delta 100 zcmaFK+|4Yu<}Cwj6$1lf69bT7WMtrrHZ(QYohW9)W@Kb+Vrn)qz(`2O!a&2`%D@l^ zYGP8V&2=m$&Q}wW1d3Tk8yH%|#-!9(m`5Ax8plq2+{ek}=g7zaBp4fDgwX5@LoF&%yCgAw}!N0&y2m|%qHN=i(5T!rT_ zzz><^KKOos60$qx`^N{{9;?nZGPPBK>>ZhRP0}q9%Df~9B5q+;DImt0feU+FylUao zFt+U+9e_l1S!V$1zNSLXX{uFI&>lUj9SjJzw!?1N9W{qO3EnoKehnNuZUl7x8 ifL-7y+sE8xfLuh>JU!#Dbks1DBgc-Kn>Pbs*YyMFiCl~T delta 153 zcmX@e+`=rj<}Cwj6$1lfH3N`fWMtrrHZ(QYohW9)Z)9X_Vrm8y;xUglvy7c+C@ODm zW@KUr6PB?s(6F~MFa&~{n3QUB9gB(6)kGwLVwTYch8D3gDK!@6(T2Llu@i60O9@*5 oB}}4?bxmVy%ndX_8fqCC*nsq8HO5d*CO=0;1|Y#Oc{ZaO0OKbjoB#j- diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS index ae9a5c958377973a79ab5080a88c8acf9eccefc0..ac155c1eb3929f8e5ee8fd982abcdd31b7b58ef6 100644 GIT binary patch delta 154 zcmZ3^@|8tr&07Z6Dh39o90mpkMn*;kp=c9b%h;HdYO~rJV+$Z{Udzb94x)7|Co1jc zZ8ElqHiapec&~yTDmOWraS0>SBqk|mMg~@}8H_*!frg4{7z1@1)oN-0DPuUrz@cKO Vpkkz;VhpmFfzcSM9LQr}000z_B7*<` delta 98 zcmey$vYbU}&07Z6Dh387IR*v>Mn*;ku4ofo%h;HdYO`8K238<#K2c{kW7)(n6|7+1 nB2wfxj^BH> z=j)r!K8OZKM9w+7Z9Yk<{q^lLuj|gyvxpG`wu_d)G8DlOxBDhSj?PWDn;D<4tde delta 184 zcmeBTnZzu%<}Cwj6$1lfCj*dRWMtrrHZ(QYohW9)XJlk-Vrm8yk}=n?x0)DZC?sQH z0Av{$0zpkoO0~I;#l%%=B9cHc%V+~bi`bZy8VmDiLtW$8iSOjyg)M**Ceg;arm;2V z2AUuZwTujGK-$m%$l$UtF*XESVGgu|-P`~uVS%E++yEp$Ig3$)lgZDKkpW0BOn$++bB&TA`z`(%5xO}oBhty^cmNYJi Xd=cMWsNP@!ABf(?0*(;I3jtXGRK*t_ delta 94 zcmZowYE{}$&d8#mVx%y+n$Zlx*ve=CW^8`R_>++bB&TA`z`(%5xO}oBhty^cmNYJi Xd=cMWsNP@!ABf(?0*(;I3jtXGFU=NC diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR index 8109f816c334a58e52f2e9564ac74fbdf35bebac..978e7d9e8b1189f153777b5a8fdcd671b2b36450 100644 GIT binary patch delta 203 zcmbQtwV8W@iCMOxhP{<35Sy6Pn3>g>o7Y%a)L2?-)|dgs3=C>O!qJ9iu{GufKp9QV zn3QUh+M11~F^r7dn@~ delta 44 xcmdnYJ(+8Q38UG@tQbZ{uFc08otP%`v6!+|F)%Q)8c&vImY5vF@|=|c1ONpW3D^Jt diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW index e184ec053804998b4e561e8eeb52fbb5ec50be1d..5cc81d80081d9825cec30cf0ade4ed17f9d29da5 100644 GIT binary patch delta 97 zcmX@h)WXcU<}Cwj6$1lf^+Zk;Z*L8ID?^Kzlo}%-BihI~HYTOosJ6x=+ECZnRM!&7 ptuY147(^Qwo5a>c8|j*ufyF@bu{GvE$~;z6QxmAmWTPVwBLF--8!Z3; delta 42 xcmZo+KFh?p<}Cwj6$1mK%S28U5fKf0D?^JKqi7>t)7Y34&6t#G(~T88i~#Mf3pM}% diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE index b368813cc1d872832df693606cc55add911704b3..472ee304999c29d1d4b7b39feea5ca890da54914 100644 GIT binary patch delta 219 zcmX|)u?oUK42Bci(<-=%;8Nj+E3{yGwe7h$3cf3))4iAd8s*A^nW9L!^ELt@DU_-E3`qSA)j?EQQZ@*_k`y76g>rXO VJ2?6u5DaQ4_188CBS}se>I3zHDv|&I literal 534 zcmbVJyH3O~5FAH$5MC0ZqD+y(mhL2P;y4M-=?YpzAJRb!ErR%u_%;54v56p}K#0b( z>zx^m*KhAwzW~`80HqX)L7d-qJtPJ|a#nA{*+ zH%?6iKTe+5j#E2SsqG?;hEyLE4wFaE>PV!jUE|x1ZZ^98&8VkC7xhH38xhtgjq97) zj&9k_J{>XVziVW-*W68w%vvZY%kahi@!|QYh#g133Kv?8j*+ThG{Fahyp*D>in1ny z0i;)0=~9ehe;oPg1qSQHOQZuCESJ9^p6kJ-@A$G^&`;;tPtoPK=+{j7tY0Q$4&VcB C0%9lt diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT index 3c4337be13d4956e30c1273a22d740c853226527..3903c9c0759d7dbc3a61778cf708c9fb4e2fbe98 100644 GIT binary patch delta 52 zcmZ3?yq%eI&07Z6Dh39|bsIUk8D%*v3@l<&s?BN{8CZd|C6ML>3K<$1o0ytSmSt=M E0A)A~w*UYD delta 32 mcmdnayqKAD&07Z6Dh39|SsOXI89AB!92psa1jA%Q#x?+m?gv@` diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RU b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RU index e5dde37919f1b36adfab7c345ac1d3dc15801c63..1c713a3f8dc5658ff784c55b9d04897c213885af 100644 GIT binary patch delta 27 hcmbQsGM8n;WJXpcjc8+&$uk)ZSlNLLv&m-}0|0F^2dV%7 delta 27 hcmbQsGM8n;WJWe+jc8*Nv&l0U4OrNKtjT8?0|0FJ2dMx6 diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE index addbd0c9ee7007019cd9eafdc9350c80eb0988f0..a857f7ea9560363c21b07580ee973502b04600ad 100644 GIT binary patch delta 102 zcmbQivzBMW7ba15bMu&#YV%q~238<#38XpA%_qNN(w?lyd{v@~fq_Y0Qv)btRIACr tp<<|@Vx*vA%&?h{#fMQqLBl-Sz)07`%sdvXW^xy^GAAcYZ1NP=764HE8D9VZ delta 67 zcmZ3>GlOTt7pBR=%!-p`n0Y3fFkhW~kX4wqih+TNYqKJY4d&Jo7| diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT index d76362e3f44c963bb86adcfeccfed4bb4013ec63..1943401852fc2c7e501cfc17a40e98763016e9c9 100644 GIT binary patch delta 64 zcmZ3-yoZ@{&07Z6Dh39|%@a8lw7f0MEHvz`jDXm{u*N9bP}d|@v&Ia_HH%*%3NZG&Z8z^pl!t|k>DJg#W|dss!D!huXPMOTihm+MAo%+{$7VAgJATZb0@d=MVpegE0UA delta 328 zcmYjNF-k*05Z#GC5MrsRL@=E{_#w0N_wTMvz#^>(c9ZS?1#ERf&JY&CL)b_z;92Z* z0xg_PK-}uR$9uE$=KJ((ym{Z7;j=N7(FXu#dcC-1j0we3z3N}+Cai_A>0(mWDg!e* z=r~_%!t6DGOl{YMBv#3sTc?Pv@-~PIY$*xr0P$>_qcJd26H~o?J@>`#8C`J%Ca newNumberFormats = new ArrayList(); newNumberFormats.add(newNumFormat); - assertEquals("(650) 253-0000", - phoneUtil.formatByPattern(usNumber, - PhoneNumberUtil.PhoneNumberFormat.NATIONAL, - newNumberFormats)); - assertEquals("+1 (650) 253-0000", - phoneUtil.formatByPattern(usNumber, - PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL, - newNumberFormats)); + assertEquals("(650) 253-0000", phoneUtil.formatByPattern(usNumber, PhoneNumberFormat.NATIONAL, + newNumberFormats)); + assertEquals("+1 (650) 253-0000", phoneUtil.formatByPattern(usNumber, + PhoneNumberFormat.INTERNATIONAL, + newNumberFormats)); // $NP is set to '1' for the US. Here we check that for other NANPA countries the US rules are // followed. @@ -540,12 +463,9 @@ public class PhoneNumberUtilTest extends TestCase { PhoneNumber bsNumber = new PhoneNumber(); bsNumber.setCountryCode(1).setNationalNumber(4168819999L); assertEquals("1 (416) 881-9999", - phoneUtil.formatByPattern(bsNumber, - PhoneNumberUtil.PhoneNumberFormat.NATIONAL, - newNumberFormats)); + phoneUtil.formatByPattern(bsNumber, PhoneNumberFormat.NATIONAL, newNumberFormats)); assertEquals("+1 416 881-9999", - phoneUtil.formatByPattern(bsNumber, - PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL, + phoneUtil.formatByPattern(bsNumber, PhoneNumberFormat.INTERNATIONAL, newNumberFormats)); PhoneNumber itNumber = new PhoneNumber(); @@ -556,12 +476,9 @@ public class PhoneNumberUtilTest extends TestCase { newNumberFormats.set(0, newNumFormat); assertEquals("02-36618 300", - phoneUtil.formatByPattern(itNumber, - PhoneNumberUtil.PhoneNumberFormat.NATIONAL, - newNumberFormats)); + phoneUtil.formatByPattern(itNumber, PhoneNumberFormat.NATIONAL, newNumberFormats)); assertEquals("+39 02-36618 300", - phoneUtil.formatByPattern(itNumber, - PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL, + phoneUtil.formatByPattern(itNumber, PhoneNumberFormat.INTERNATIONAL, newNumberFormats)); PhoneNumber gbNumber = new PhoneNumber(); @@ -572,53 +489,40 @@ public class PhoneNumberUtilTest extends TestCase { newNumFormat.setFormat("$1 $2 $3"); newNumberFormats.set(0, newNumFormat); assertEquals("020 1234 5678", - phoneUtil.formatByPattern(gbNumber, - PhoneNumberUtil.PhoneNumberFormat.NATIONAL, - newNumberFormats)); + phoneUtil.formatByPattern(gbNumber, PhoneNumberFormat.NATIONAL, newNumberFormats)); newNumFormat.setNationalPrefixFormattingRule("($NP$FG)"); assertEquals("(020) 1234 5678", - phoneUtil.formatByPattern(gbNumber, - PhoneNumberUtil.PhoneNumberFormat.NATIONAL, - newNumberFormats)); + phoneUtil.formatByPattern(gbNumber, PhoneNumberFormat.NATIONAL, newNumberFormats)); newNumFormat.setNationalPrefixFormattingRule(""); assertEquals("20 1234 5678", - phoneUtil.formatByPattern(gbNumber, - PhoneNumberUtil.PhoneNumberFormat.NATIONAL, - newNumberFormats)); + phoneUtil.formatByPattern(gbNumber, PhoneNumberFormat.NATIONAL, newNumberFormats)); newNumFormat.setNationalPrefixFormattingRule(""); assertEquals("+44 20 1234 5678", - phoneUtil.formatByPattern(gbNumber, - PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL, + phoneUtil.formatByPattern(gbNumber, PhoneNumberFormat.INTERNATIONAL, newNumberFormats)); } public void testFormatE164Number() { PhoneNumber usNumber = new PhoneNumber(); usNumber.setCountryCode(1).setNationalNumber(6502530000L); - assertEquals("+16502530000", phoneUtil.format(usNumber, - PhoneNumberUtil.PhoneNumberFormat.E164)); + assertEquals("+16502530000", phoneUtil.format(usNumber, PhoneNumberFormat.E164)); PhoneNumber deNumber = new PhoneNumber(); deNumber.setCountryCode(49).setNationalNumber(301234L); - assertEquals("+49301234", phoneUtil.format(deNumber, - PhoneNumberUtil.PhoneNumberFormat.E164)); + assertEquals("+49301234", phoneUtil.format(deNumber, PhoneNumberFormat.E164)); } public void testFormatNumberWithExtension() { PhoneNumber nzNumber = new PhoneNumber(); nzNumber.setCountryCode(64).setNationalNumber(33316005L).setExtension("1234"); // Uses default extension prefix: - assertEquals("03-331 6005 ext. 1234", - phoneUtil.format(nzNumber, - PhoneNumberUtil.PhoneNumberFormat.NATIONAL)); + assertEquals("03-331 6005 ext. 1234", phoneUtil.format(nzNumber, PhoneNumberFormat.NATIONAL)); // Extension prefix overridden in the territory information for the US: PhoneNumber usNumber = new PhoneNumber(); usNumber.setCountryCode(1).setNationalNumber(6502530000L).setExtension("4567"); - assertEquals("650 253 0000 extn. 4567", - phoneUtil.format(usNumber, - PhoneNumberUtil.PhoneNumberFormat.NATIONAL)); + assertEquals("650 253 0000 extn. 4567", phoneUtil.format(usNumber, PhoneNumberFormat.NATIONAL)); } public void testFormatUsingOriginalNumberFormat() throws Exception { @@ -1361,6 +1265,14 @@ public class PhoneNumberUtilTest extends TestCase { assertEquals(usNumber, phoneUtil.parse("0191-650-333-6000", "SG")); // Calling the US number from Poland assertEquals(usNumber, phoneUtil.parse("0~01-650-333-6000", "PL")); + // Using "++" at the start. + assertEquals(usNumber, phoneUtil.parse("++1 (650) 333-6000", "PL")); + // Using a full-width plus sign. + assertEquals(usNumber, phoneUtil.parse("\uFF0B1 (650) 333-6000", "SG")); + // The whole number, including punctuation, is here represented in full-width form. + assertEquals(usNumber, phoneUtil.parse("\uFF0B\uFF11\u3000\uFF08\uFF16\uFF15\uFF10\uFF09" + + "\u3000\uFF13\uFF13\uFF13\uFF0D\uFF16\uFF10\uFF10\uFF10", + "SG")); } public void testParseWithLeadingZero() throws Exception { @@ -1558,6 +1470,17 @@ public class PhoneNumberUtilTest extends TestCase { NumberParseException.ErrorType.TOO_SHORT_AFTER_IDD, e.getErrorType()); } + try { + String emptyNumber = ""; + // Invalid region. + phoneUtil.parse(emptyNumber, "ZZ"); + fail("Empty string - should fail."); + } catch (NumberParseException e) { + // Expected this exception. + assertEquals("Wrong error type stored in exception.", + NumberParseException.ErrorType.NOT_A_NUMBER, + e.getErrorType()); + } } public void testParseNumbersWithPlusWithNoRegion() throws Exception { @@ -1675,12 +1598,9 @@ public class PhoneNumberUtilTest extends TestCase { // Andorra is a country where we don't have PhoneNumberDesc info in the metadata. PhoneNumber adNumber = new PhoneNumber(); adNumber.setCountryCode(376).setNationalNumber(12345L); - assertEquals("+376 12345", phoneUtil.format(adNumber, - PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)); - assertEquals("+37612345", phoneUtil.format(adNumber, - PhoneNumberUtil.PhoneNumberFormat.E164)); - assertEquals("12345", phoneUtil.format(adNumber, - PhoneNumberUtil.PhoneNumberFormat.NATIONAL)); + assertEquals("+376 12345", phoneUtil.format(adNumber, PhoneNumberFormat.INTERNATIONAL)); + assertEquals("+37612345", phoneUtil.format(adNumber, PhoneNumberFormat.E164)); + assertEquals("12345", phoneUtil.format(adNumber, PhoneNumberFormat.NATIONAL)); assertEquals(PhoneNumberUtil.PhoneNumberType.UNKNOWN, phoneUtil.getNumberType(adNumber)); assertTrue(phoneUtil.isValidNumber(adNumber));