diff --git a/cpp/src/phonenumbers/phonenumberutil.cc b/cpp/src/phonenumbers/phonenumberutil.cc index f1442974f3..c0c9d09a04 100644 --- a/cpp/src/phonenumbers/phonenumberutil.cc +++ b/cpp/src/phonenumbers/phonenumberutil.cc @@ -1710,6 +1710,17 @@ void PhoneNumberUtil::FormatOutOfCountryKeepingAlphaChars( PrefixNumberWithCountryCallingCode(country_code, INTERNATIONAL, formatted_number); } + std::string region_code; + GetRegionCodeForCountryCode(country_code, ®ion_code); + // Metadata cannot be null because the country code is valid. + const PhoneMetadata* metadata_for_region = + GetMetadataForRegionOrCallingCode(country_code, region_code); + // Strip any extension + std::string extension; + MaybeStripExtension(formatted_number, &extension); + // Append the formatted extension + MaybeAppendFormattedExtension(number, *metadata_for_region, INTERNATIONAL, + formatted_number); } const NumberFormat* PhoneNumberUtil::ChooseFormattingPatternForNumber( diff --git a/cpp/test/phonenumbers/phonenumberutil_test.cc b/cpp/test/phonenumbers/phonenumberutil_test.cc index 4f69903492..97cf1f08a4 100644 --- a/cpp/test/phonenumbers/phonenumberutil_test.cc +++ b/cpp/test/phonenumbers/phonenumberutil_test.cc @@ -935,6 +935,16 @@ TEST_F(PhoneNumberUtilTest, FormatOutOfCountryKeepingAlphaChars) { &formatted_number); EXPECT_EQ("1 800 SIX-FLAG", formatted_number); + // Testing a number with extension. + formatted_number.clear(); + PhoneNumber alpha_numeric_number_with_extn; + phone_util_.ParseAndKeepRawInput("800 SIX-flag ext. 1234", RegionCode::US(), + &alpha_numeric_number_with_extn); + // preferredExtnPrefix for US is " extn. " (in test metadata) + phone_util_.FormatOutOfCountryKeepingAlphaChars( + alpha_numeric_number_with_extn, RegionCode::AU(), &formatted_number); + EXPECT_EQ("0011 1 800 SIX-FLAG extn. 1234", formatted_number); + // Testing that if the raw input doesn't exist, it is formatted using // FormatOutOfCountryCallingNumber. alpha_numeric_number.clear_raw_input(); diff --git a/java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java b/java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java index d843bbbe9c..6d8004f182 100644 --- a/java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java +++ b/java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java @@ -1878,8 +1878,11 @@ public String formatOutOfCountryKeepingAlphaChars(PhoneNumber number, String regionCode = getRegionCodeForCountryCode(countryCode); // Metadata cannot be null because the country calling code is valid. PhoneMetadata metadataForRegion = getMetadataForRegionOrCallingCode(countryCode, regionCode); - maybeAppendFormattedExtension(number, metadataForRegion, - PhoneNumberFormat.INTERNATIONAL, formattedNumber); + // Strip any extension + maybeStripExtension(formattedNumber); + // Append the formatted extension + maybeAppendFormattedExtension( + number, metadataForRegion, PhoneNumberFormat.INTERNATIONAL, formattedNumber); if (internationalPrefixForFormatting.length() > 0) { formattedNumber.insert(0, " ").insert(0, countryCode).insert(0, " ") .insert(0, internationalPrefixForFormatting); diff --git a/java/libphonenumber/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java b/java/libphonenumber/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java index 6bdef41a7c..2b9345c4c7 100644 --- a/java/libphonenumber/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java +++ b/java/libphonenumber/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java @@ -675,7 +675,7 @@ public void testFormatOutOfCountryWithPreferredIntlPrefix() { phoneUtil.formatOutOfCountryCallingNumber(IT_NUMBER, RegionCode.UZ)); } - public void testFormatOutOfCountryKeepingAlphaChars() { + public void testFormatOutOfCountryKeepingAlphaChars() throws Exception { PhoneNumber alphaNumericNumber = new PhoneNumber(); alphaNumericNumber.setCountryCode(1).setNationalNumber(8007493524L) .setRawInput("1800 six-flag"); @@ -701,6 +701,13 @@ public void testFormatOutOfCountryKeepingAlphaChars() { assertEquals("1 800 SIX-FLAG", phoneUtil.formatOutOfCountryKeepingAlphaChars(alphaNumericNumber, RegionCode.BS)); + // Testing a number with extension. + PhoneNumber alphaNumericNumberWithExtn = + phoneUtil.parseAndKeepRawInput("800 SIX-flag ext. 1234", RegionCode.US); + assertEquals( + "0011 1 800 SIX-FLAG extn. 1234", + phoneUtil.formatOutOfCountryKeepingAlphaChars(alphaNumericNumberWithExtn, RegionCode.AU)); + // Testing that if the raw input doesn't exist, it is formatted using // formatOutOfCountryCallingNumber. alphaNumericNumber.clearRawInput(); diff --git a/javascript/i18n/phonenumbers/phonenumberutil.js b/javascript/i18n/phonenumbers/phonenumberutil.js index d6e67138ec..8812d3aa4e 100644 --- a/javascript/i18n/phonenumbers/phonenumberutil.js +++ b/javascript/i18n/phonenumbers/phonenumberutil.js @@ -4771,8 +4771,7 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.canBeInternationallyDialled = */ i18n.phonenumbers.PhoneNumberUtil.matchesEntirely = function(regex, str) { /** @type {Array.} */ - var matchedGroups = (typeof regex == 'string') ? - str.match('^(?:' + regex + ')$') : str.match(regex); + var matchedGroups = str.match(new RegExp('^(?:' + (typeof regex == 'string' ? regex : regex.source) + ')$', 'i')); if (matchedGroups && matchedGroups[0].length == str.length) { return true; } diff --git a/pending_code_changes.txt b/pending_code_changes.txt index 8b13789179..d67706acc0 100644 --- a/pending_code_changes.txt +++ b/pending_code_changes.txt @@ -1 +1,2 @@ - +Code changes: + - Fixed a bug where the extension was appended twice in formatOutOfCountryKeepingAlphaChars in the Java version and updated FormatOutOfCountryKeepingAlphaChars in the C++ version to format the extension. \ No newline at end of file