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 cc68781c9..d5c398595 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AF and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_AF differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF
index 9f21ab137..99e001ae9 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO
index 04d2f92e2..577f50510 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BO differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES
index 63dacfd90..85d0e22b7 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB
index 1a8b8b8dc..6457a19d8 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GB differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG
index 48a79134d..221e99ca0 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GG differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GN b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GN
index 1ffdc7d4f..284d8828c 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GN and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_GN differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IM b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IM
index 03b7a7dd8..1e9692e74 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IM and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IM differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS
index ae9a5c958..ac155c1eb 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_IS differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE
index 15ad12fac..7c24093bb 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JE differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP
index f27ef87fd..ab74bd891 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_JP differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR
index 8109f816c..978e7d9e8 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KR differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW
index e184ec053..5cc81d800 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE
index b368813cc..472ee3049 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PE differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT
index 3c4337be1..3903c9c07 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_PT differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RU b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RU
index e5dde3791..1c713a3f8 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RU and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_RU differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE
index addbd0c9e..a857f7ea9 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_SE differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT
index d76362e3f..194340185 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_TT differ
diff --git a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZW b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZW
index 76cfe3be3..99b27ec0d 100644
Binary files a/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZW and b/java/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ZW differ
diff --git a/java/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java b/java/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java
index 4975189dc..1e96cdb4a 100644
--- a/java/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java
+++ b/java/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java
@@ -20,6 +20,7 @@ import com.google.i18n.phonenumbers.Phonemetadata.NumberFormat;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata;
import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber.CountryCodeSource;
+import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat;
import junit.framework.TestCase;
@@ -237,194 +238,122 @@ public class PhoneNumberUtilTest extends TestCase {
public void testFormatUSNumber() {
PhoneNumber usNumber = new PhoneNumber();
usNumber.setCountryCode(1).setNationalNumber(6502530000L);
- assertEquals("650 253 0000", phoneUtil.format(usNumber,
- PhoneNumberUtil.PhoneNumberFormat.NATIONAL));
- assertEquals("+1 650 253 0000",
- phoneUtil.format(usNumber,
- PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL));
+ assertEquals("650 253 0000", phoneUtil.format(usNumber, PhoneNumberFormat.NATIONAL));
+ assertEquals("+1 650 253 0000", phoneUtil.format(usNumber, PhoneNumberFormat.INTERNATIONAL));
usNumber.clear();
usNumber.setCountryCode(1).setNationalNumber(8002530000L);
- assertEquals("800 253 0000", phoneUtil.format(usNumber,
- PhoneNumberUtil.PhoneNumberFormat.NATIONAL));
- assertEquals("+1 800 253 0000",
- phoneUtil.format(usNumber,
- PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL));
+ assertEquals("800 253 0000", phoneUtil.format(usNumber, PhoneNumberFormat.NATIONAL));
+ assertEquals("+1 800 253 0000", phoneUtil.format(usNumber, PhoneNumberFormat.INTERNATIONAL));
usNumber.clear();
usNumber.setCountryCode(1).setNationalNumber(9002530000L);
- assertEquals("900 253 0000", phoneUtil.format(usNumber,
- PhoneNumberUtil.PhoneNumberFormat.NATIONAL));
- assertEquals("+1 900 253 0000",
- phoneUtil.format(usNumber,
- PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL));
+ assertEquals("900 253 0000", phoneUtil.format(usNumber, PhoneNumberFormat.NATIONAL));
+ assertEquals("+1 900 253 0000", phoneUtil.format(usNumber, PhoneNumberFormat.INTERNATIONAL));
}
public void testFormatBSNumber() {
PhoneNumber bsNumber = new PhoneNumber();
bsNumber.setCountryCode(1).setNationalNumber(2421234567L);
- assertEquals("242 123 4567", phoneUtil.format(bsNumber,
- PhoneNumberUtil.PhoneNumberFormat.NATIONAL));
- assertEquals("+1 242 123 4567",
- phoneUtil.format(bsNumber,
- PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL));
+ assertEquals("242 123 4567", phoneUtil.format(bsNumber, PhoneNumberFormat.NATIONAL));
+ assertEquals("+1 242 123 4567", phoneUtil.format(bsNumber, PhoneNumberFormat.INTERNATIONAL));
bsNumber.clear();
bsNumber.setCountryCode(1).setNationalNumber(8002530000L);
- assertEquals("800 253 0000", phoneUtil.format(bsNumber,
- PhoneNumberUtil.PhoneNumberFormat.NATIONAL));
- assertEquals("+1 800 253 0000",
- phoneUtil.format(bsNumber,
- PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL));
+ assertEquals("800 253 0000", phoneUtil.format(bsNumber, PhoneNumberFormat.NATIONAL));
+ assertEquals("+1 800 253 0000", phoneUtil.format(bsNumber, PhoneNumberFormat.INTERNATIONAL));
bsNumber.clear();
bsNumber.setCountryCode(1).setNationalNumber(9002530000L);
- assertEquals("900 253 0000", phoneUtil.format(bsNumber,
- PhoneNumberUtil.PhoneNumberFormat.NATIONAL));
- assertEquals("+1 900 253 0000",
- phoneUtil.format(bsNumber,
- PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL));
+ assertEquals("900 253 0000", phoneUtil.format(bsNumber, PhoneNumberFormat.NATIONAL));
+ assertEquals("+1 900 253 0000", phoneUtil.format(bsNumber, PhoneNumberFormat.INTERNATIONAL));
}
public void testFormatGBNumber() {
PhoneNumber gbNumber = new PhoneNumber();
gbNumber.setCountryCode(44).setNationalNumber(2087389353L);
- assertEquals("(020) 8738 9353", phoneUtil.format(gbNumber,
- PhoneNumberUtil.PhoneNumberFormat.NATIONAL));
- assertEquals("+44 20 8738 9353",
- phoneUtil.format(gbNumber,
- PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL));
+ assertEquals("(020) 8738 9353", phoneUtil.format(gbNumber, PhoneNumberFormat.NATIONAL));
+ assertEquals("+44 20 8738 9353", phoneUtil.format(gbNumber, PhoneNumberFormat.INTERNATIONAL));
gbNumber.clear();
gbNumber.setCountryCode(44).setNationalNumber(7912345678L);
- assertEquals("(07912) 345 678", phoneUtil.format(gbNumber,
- PhoneNumberUtil.PhoneNumberFormat.NATIONAL));
- assertEquals("+44 7912 345 678",
- phoneUtil.format(gbNumber,
- PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL));
+ assertEquals("(07912) 345 678", phoneUtil.format(gbNumber, PhoneNumberFormat.NATIONAL));
+ assertEquals("+44 7912 345 678", phoneUtil.format(gbNumber, PhoneNumberFormat.INTERNATIONAL));
}
public void testFormatDENumber() {
PhoneNumber deNumber = new PhoneNumber();
deNumber.setCountryCode(49).setNationalNumber(301234L);
- assertEquals("030 1234", phoneUtil.format(deNumber,
- PhoneNumberUtil.PhoneNumberFormat.NATIONAL));
- assertEquals("+49 30 1234",
- phoneUtil.format(deNumber,
- PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL));
+ assertEquals("030 1234", phoneUtil.format(deNumber, PhoneNumberFormat.NATIONAL));
+ assertEquals("+49 30 1234", phoneUtil.format(deNumber, PhoneNumberFormat.INTERNATIONAL));
deNumber.clear();
deNumber.setCountryCode(49).setNationalNumber(291123L);
- assertEquals("0291 123", phoneUtil.format(deNumber,
- PhoneNumberUtil.PhoneNumberFormat.NATIONAL));
- assertEquals("+49 291 123",
- phoneUtil.format(deNumber,
- PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL));
+ assertEquals("0291 123", phoneUtil.format(deNumber, PhoneNumberFormat.NATIONAL));
+ assertEquals("+49 291 123", phoneUtil.format(deNumber, PhoneNumberFormat.INTERNATIONAL));
deNumber.clear();
deNumber.setCountryCode(49).setNationalNumber(29112345678L);
- assertEquals("0291 12345678", phoneUtil.format(deNumber,
- PhoneNumberUtil.PhoneNumberFormat.NATIONAL));
- assertEquals("+49 291 12345678",
- phoneUtil.format(deNumber,
- PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL));
+ assertEquals("0291 12345678", phoneUtil.format(deNumber, PhoneNumberFormat.NATIONAL));
+ assertEquals("+49 291 12345678", phoneUtil.format(deNumber, PhoneNumberFormat.INTERNATIONAL));
deNumber.clear();
deNumber.setCountryCode(49).setNationalNumber(9123123L);
- assertEquals("09123 123", phoneUtil.format(deNumber,
- PhoneNumberUtil.PhoneNumberFormat.NATIONAL));
- assertEquals("+49 9123 123",
- phoneUtil.format(deNumber,
- PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL));
+ assertEquals("09123 123", phoneUtil.format(deNumber, PhoneNumberFormat.NATIONAL));
+ assertEquals("+49 9123 123", phoneUtil.format(deNumber, PhoneNumberFormat.INTERNATIONAL));
deNumber.clear();
deNumber.setCountryCode(49).setNationalNumber(80212345L);
- assertEquals("08021 2345", phoneUtil.format(deNumber,
- PhoneNumberUtil.PhoneNumberFormat.NATIONAL));
- assertEquals("+49 8021 2345",
- phoneUtil.format(deNumber,
- PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL));
+ assertEquals("08021 2345", phoneUtil.format(deNumber, PhoneNumberFormat.NATIONAL));
+ assertEquals("+49 8021 2345", phoneUtil.format(deNumber, PhoneNumberFormat.INTERNATIONAL));
deNumber.clear();
deNumber.setCountryCode(49).setNationalNumber(1234L);
// Note this number is correctly formatted without national prefix. Most of the numbers that
// are treated as invalid numbers by the library are short numbers, and they are usually not
// dialed with national prefix.
- assertEquals("1234", phoneUtil.format(deNumber,
- PhoneNumberUtil.PhoneNumberFormat.NATIONAL));
- assertEquals("+49 1234",
- phoneUtil.format(deNumber,
- PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL));
+ assertEquals("1234", phoneUtil.format(deNumber, PhoneNumberFormat.NATIONAL));
+ assertEquals("+49 1234", phoneUtil.format(deNumber, PhoneNumberFormat.INTERNATIONAL));
}
public void testFormatITNumber() {
PhoneNumber itNumber = new PhoneNumber();
itNumber.setCountryCode(39).setNationalNumber(236618300L).setItalianLeadingZero(true);
- assertEquals("02 3661 8300", phoneUtil.format(itNumber,
- PhoneNumberUtil.PhoneNumberFormat.NATIONAL));
- assertEquals("+39 02 3661 8300",
- phoneUtil.format(itNumber,
- PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL));
- assertEquals("+390236618300",
- phoneUtil.format(itNumber,
- PhoneNumberUtil.PhoneNumberFormat.E164));
+ assertEquals("02 3661 8300", phoneUtil.format(itNumber, PhoneNumberFormat.NATIONAL));
+ assertEquals("+39 02 3661 8300", phoneUtil.format(itNumber, PhoneNumberFormat.INTERNATIONAL));
+ assertEquals("+390236618300", phoneUtil.format(itNumber, PhoneNumberFormat.E164));
itNumber.clear();
itNumber.setCountryCode(39).setNationalNumber(345678901L);
- assertEquals("345 678 901", phoneUtil.format(itNumber,
- PhoneNumberUtil.PhoneNumberFormat.NATIONAL));
- assertEquals("+39 345 678 901",
- phoneUtil.format(itNumber,
- PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL));
- assertEquals("+39345678901",
- phoneUtil.format(itNumber,
- PhoneNumberUtil.PhoneNumberFormat.E164));
+ assertEquals("345 678 901", phoneUtil.format(itNumber, PhoneNumberFormat.NATIONAL));
+ assertEquals("+39 345 678 901", phoneUtil.format(itNumber, PhoneNumberFormat.INTERNATIONAL));
+ assertEquals("+39345678901", phoneUtil.format(itNumber, PhoneNumberFormat.E164));
}
public void testFormatAUNumber() {
PhoneNumber auNumber = new PhoneNumber();
auNumber.setCountryCode(61).setNationalNumber(236618300L);
- assertEquals("02 3661 8300", phoneUtil.format(auNumber,
- PhoneNumberUtil.PhoneNumberFormat.NATIONAL));
- assertEquals("+61 2 3661 8300",
- phoneUtil.format(auNumber,
- PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL));
- assertEquals("+61236618300",
- phoneUtil.format(auNumber,
- PhoneNumberUtil.PhoneNumberFormat.E164));
+ assertEquals("02 3661 8300", phoneUtil.format(auNumber, PhoneNumberFormat.NATIONAL));
+ assertEquals("+61 2 3661 8300", phoneUtil.format(auNumber, PhoneNumberFormat.INTERNATIONAL));
+ assertEquals("+61236618300", phoneUtil.format(auNumber, PhoneNumberFormat.E164));
auNumber.clear();
auNumber.setCountryCode(61).setNationalNumber(1800123456L);
- assertEquals("1800 123 456", phoneUtil.format(auNumber,
- PhoneNumberUtil.PhoneNumberFormat.NATIONAL));
- assertEquals("+61 1800 123 456",
- phoneUtil.format(auNumber,
- PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL));
- assertEquals("+611800123456",
- phoneUtil.format(auNumber,
- PhoneNumberUtil.PhoneNumberFormat.E164));
+ assertEquals("1800 123 456", phoneUtil.format(auNumber, PhoneNumberFormat.NATIONAL));
+ assertEquals("+61 1800 123 456", phoneUtil.format(auNumber, PhoneNumberFormat.INTERNATIONAL));
+ assertEquals("+611800123456", phoneUtil.format(auNumber, PhoneNumberFormat.E164));
}
public void testFormatARNumber() {
PhoneNumber arNumber = new PhoneNumber();
arNumber.setCountryCode(54).setNationalNumber(1187654321L);
- assertEquals("011 8765-4321", phoneUtil.format(arNumber,
- PhoneNumberUtil.PhoneNumberFormat.NATIONAL));
- assertEquals("+54 11 8765-4321",
- phoneUtil.format(arNumber,
- PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL));
- assertEquals("+541187654321",
- phoneUtil.format(arNumber,
- PhoneNumberUtil.PhoneNumberFormat.E164));
+ assertEquals("011 8765-4321", phoneUtil.format(arNumber, PhoneNumberFormat.NATIONAL));
+ assertEquals("+54 11 8765-4321", phoneUtil.format(arNumber, PhoneNumberFormat.INTERNATIONAL));
+ assertEquals("+541187654321", phoneUtil.format(arNumber, PhoneNumberFormat.E164));
arNumber.clear();
arNumber.setCountryCode(54).setNationalNumber(91187654321L);
- assertEquals("011 15 8765-4321", phoneUtil.format(arNumber,
- PhoneNumberUtil.PhoneNumberFormat.NATIONAL));
- assertEquals("+54 9 11 8765 4321",
- phoneUtil.format(arNumber,
- PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL));
- assertEquals("+5491187654321",
- phoneUtil.format(arNumber,
- PhoneNumberUtil.PhoneNumberFormat.E164));
+ assertEquals("011 15 8765-4321", phoneUtil.format(arNumber, PhoneNumberFormat.NATIONAL));
+ assertEquals("+54 9 11 8765 4321", phoneUtil.format(arNumber, PhoneNumberFormat.INTERNATIONAL));
+ assertEquals("+5491187654321", phoneUtil.format(arNumber, PhoneNumberFormat.E164));
}
public void testFormatOutOfCountryCallingNumber() {
@@ -499,18 +428,15 @@ public class PhoneNumberUtilTest extends TestCase {
// We only support this for AR in our test metadata.
PhoneNumber arNumber = new PhoneNumber();
arNumber.setCountryCode(54).setNationalNumber(91234125678L);
- assertEquals("01234 12-5678", phoneUtil.format(arNumber,
- PhoneNumberUtil.PhoneNumberFormat.NATIONAL));
+ assertEquals("01234 12-5678", phoneUtil.format(arNumber, PhoneNumberFormat.NATIONAL));
// Test formatting with a carrier code.
assertEquals("01234 15 12-5678", phoneUtil.formatNationalNumberWithCarrierCode(arNumber, "15"));
// Here the international rule is used, so no carrier code should be present.
- assertEquals("+5491234125678", phoneUtil.format(arNumber,
- PhoneNumberUtil.PhoneNumberFormat.E164));
+ assertEquals("+5491234125678", phoneUtil.format(arNumber, PhoneNumberFormat.E164));
// We don't support this for the US so there should be no change.
PhoneNumber usNumber = new PhoneNumber();
usNumber.setCountryCode(1).setNationalNumber(4241231234L);
- assertEquals("424 123 1234", phoneUtil.format(usNumber,
- PhoneNumberUtil.PhoneNumberFormat.NATIONAL));
+ assertEquals("424 123 1234", phoneUtil.format(usNumber, PhoneNumberFormat.NATIONAL));
assertEquals("424 123 1234", phoneUtil.formatNationalNumberWithCarrierCode(usNumber, "15"));
}
@@ -524,14 +450,11 @@ public class PhoneNumberUtilTest extends TestCase {
List 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));