Skip to content

Commit

Permalink
Always use preferred intl prefix if present
Browse files Browse the repository at this point in the history
After this change, the API always use preferred intl prefix if present, not just for numbers with a non-unique IDD. This means we will output "8~10" as the prefix if calling formatOutOfCountryCallingNumber instead of "810" for some regions that have this tilde in their prefix [designates that the user should wait before continuing to dial].

Mirrors google/libphonenumber#2621
  • Loading branch information
giggsey committed May 26, 2021
1 parent a6ff019 commit b18f2d0
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 11 deletions.
23 changes: 14 additions & 9 deletions src/PhoneNumberUtil.php
Original file line number Diff line number Diff line change
Expand Up @@ -502,8 +502,8 @@ protected static function createExtnPattern($forParsing)
$extLimitAfterLikelyLabel = 15;
$extLimitAfterAmbiguousChar = 9;
$extLimitWhenNotSure = 6;



$possibleSeparatorsBetweenNumberAndExtLabel = "[ \xC2\xA0\\t,]*";
// Optional full stop (.) or colon, followed by zero or more spaces/tabs/commas.
Expand Down Expand Up @@ -2769,23 +2769,28 @@ public function formatOutOfCountryCallingNumber(PhoneNumber $number, $regionCall
return $this->format($number, PhoneNumberFormat::NATIONAL);
}
// Metadata cannot be null because we checked 'isValidRegionCode()' above.
/** @var PhoneMetadata $metadataForRegionCallingFrom */
$metadataForRegionCallingFrom = $this->getMetadataForRegion($regionCallingFrom);

$internationalPrefix = $metadataForRegionCallingFrom->getInternationalPrefix();

// For regions that have multiple international prefixes, the international format of the
// number is returned, unless there is a preferred international prefix.
// In general, if there is a preferred international prefix, use that. Otherwise, for regions
// that have multiple international prefixes, the international format of the number is
// returned since we would not know which one to use.
$internationalPrefixForFormatting = '';
$uniqueInternationalPrefixMatcher = new Matcher(static::SINGLE_INTERNATIONAL_PREFIX, $internationalPrefix);

if ($uniqueInternationalPrefixMatcher->matches()) {
$internationalPrefixForFormatting = $internationalPrefix;
} elseif ($metadataForRegionCallingFrom->hasPreferredInternationalPrefix()) {
if ($metadataForRegionCallingFrom->hasPreferredInternationalPrefix()) {
$internationalPrefixForFormatting = $metadataForRegionCallingFrom->getPreferredInternationalPrefix();
} else {
$uniqueInternationalPrefixMatcher = new Matcher(static::SINGLE_INTERNATIONAL_PREFIX, $internationalPrefix);

if ($uniqueInternationalPrefixMatcher->matches()) {
$internationalPrefixForFormatting = $internationalPrefix;
}
}

$regionCode = $this->getRegionCodeForCountryCode($countryCallingCode);
// Metadata cannot be null because the country calling code is valid.
/** @var PhoneMetadata $metadataForRegion */
$metadataForRegion = $this->getMetadataForRegionOrCallingCode($countryCallingCode, $regionCode);
$formattedNationalNumber = $this->formatNsn(
$nationalSignificantNumber,
Expand Down
4 changes: 2 additions & 2 deletions tests/buildtools/BuildMetadataFromXmlTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ public function testLoadTerritoryTagMetadata()
{
$xmlInput = '<territory'
. " countryCode='33' leadingDigits='2' internationalPrefix='00'"
. " preferredInternationalPrefix='0011' nationalPrefixForParsing='0'"
. " preferredInternationalPrefix='00~11' nationalPrefixForParsing='0'"
. " nationalPrefixTransformRule='9$1'" // nationalPrefix manually injected.
. " preferredExtnPrefix=' x' mainCountryForCode='true'"
. " leadingZeroPossible='true' mobileNumberPortableRegion='true'>"
Expand All @@ -107,7 +107,7 @@ public function testLoadTerritoryTagMetadata()
$this->assertEquals(33, $phoneMetadata->getCountryCode());
$this->assertEquals('2', $phoneMetadata->getLeadingDigits());
$this->assertEquals('00', $phoneMetadata->getInternationalPrefix());
$this->assertEquals('0011', $phoneMetadata->getPreferredInternationalPrefix());
$this->assertEquals('00~11', $phoneMetadata->getPreferredInternationalPrefix());
$this->assertEquals('0', $phoneMetadata->getNationalPrefixForParsing());
$this->assertEquals('9$1', $phoneMetadata->getNationalPrefixTransformRule());
$this->assertEquals('0', $phoneMetadata->getNationalPrefix());
Expand Down
4 changes: 4 additions & 0 deletions tests/core/PhoneNumberUtilTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -829,6 +829,10 @@ public function testFormatOutOfCountryWithPreferredIntlPrefix()
'0011 39 02 3661 8300',
$this->phoneUtil->formatOutOfCountryCallingNumber(self::$itNumber, RegionCode::AU)
);

// Testing preferred international prefixes with ~ are supported (designates waiting).
$this->assertEquals('8~10 39 02 3661 8300',
$this->phoneUtil->formatOutOfCountryCallingNumber(self::$itNumber, RegionCode::UZ));
}

public function testFormatOutOfCountryKeepingAlphaChars()
Expand Down

0 comments on commit b18f2d0

Please sign in to comment.