Sets the country code of this phone number.
public setCountryCode ( integer $value ) : |
||
$value | integer | The country code. |
return | This PhoneNumber instance, for chaining method calls. |
public function testGBNumber() { $number = new PhoneNumber(); $number->setCountryCode(44)->setNationalNumber(1614960000); $timeZone = PhoneNumberToTimeZonesMapper::getInstance(); $this->assertEquals(array("Europe/London"), $timeZone->getTimeZonesForNumber($number)); }
public function testEqualWithPreferredDomesticCarrierCodeSetToDefault() { $numberA = new PhoneNumber(); $numberA->setCountryCode(1)->setNationalNumber(6502530000)->setPreferredDomesticCarrierCode(""); $numberB = new PhoneNumber(); $numberB->setCountryCode(1)->setNationalNumber(6502530000)->setPreferredDomesticCarrierCode(""); $this->assertEquals($numberA, $numberB); }
public function testSerializingPhoneNumber2() { $phoneNumber = new PhoneNumber(); $phoneNumber->setCountryCode(1); $phoneNumber->setNationalNumber(1); $phoneNumber->setExtension(1); $phoneNumber->setItalianLeadingZero(1); $phoneNumber->setNumberOfLeadingZeros(1); $phoneNumber->setRawInput(1); $phoneNumber->setCountryCodeSource(1); $phoneNumber->setPreferredDomesticCarrierCode(1); $serializedString = serialize($phoneNumber); $phoneObject2 = unserialize($serializedString); $this->assertTrue($phoneObject2->equals($phoneNumber)); }
public function testLookupTimeZonesForNumber_RU() { $number = new PhoneNumber(); $number->setCountryCode(7)->setNationalNumber(87945154); $this->assertEquals(array(self::MOSCOW_TZ), self::$prefixTimeZonesMapForRU->lookupTimeZonesForNumber($number)); $number->setNationalNumber(421548578); $this->assertEquals(array(self::VLADIVOSTOK_TZ), self::$prefixTimeZonesMapForRU->lookupTimeZonesForNumber($number)); $number->setNationalNumber(342457897); $this->assertEquals(array(self::YEKATERINBURG_TZ), self::$prefixTimeZonesMapForRU->lookupTimeZonesForNumber($number)); // A mobile number $number->setNationalNumber(9342457897); $this->assertEquals(array(), self::$prefixTimeZonesMapForRU->lookupTimeZonesForNumber($number)); // An invalid number (too short) $number->setNationalNumber(3951); $this->assertEquals(array(self::IRKUTSK_TZ), self::$prefixTimeZonesMapForRU->lookupTimeZonesForNumber($number)); }
public function testEmergencyNumberForSharedCountryCallingCode() { // Test the emergency number 112, which is valid in both Australia and the Christmas Islands. $this->assertTrue($this->shortInfo->isEmergencyNumber("112", RegionCode::AU)); $this->assertTrue($this->shortInfo->isValidShortNumberForRegion($this->parse("112", RegionCode::AU), RegionCode::AU)); $this->assertEquals(ShortNumberCost::TOLL_FREE, $this->shortInfo->getExpectedCostForRegion($this->parse("112", RegionCode::AU), RegionCode::AU)); $this->assertTrue($this->shortInfo->isEmergencyNumber("112", RegionCode::CX)); $this->assertTrue($this->shortInfo->isValidShortNumberForRegion($this->parse("112", RegionCode::CX), RegionCode::CX)); $this->assertEquals(ShortNumberCost::TOLL_FREE, $this->shortInfo->getExpectedCostForRegion($this->parse("112", RegionCode::CX), RegionCode::CX)); $sharedEmergencyNumber = new PhoneNumber(); $sharedEmergencyNumber->setCountryCode(61)->setNationalNumber(112); $this->assertTrue($this->shortInfo->isValidShortNumber($sharedEmergencyNumber)); $this->assertEquals(ShortNumberCost::TOLL_FREE, $this->shortInfo->getExpectedCost($sharedEmergencyNumber)); }
public function testIsNumberMatchShortNsnMatches() { // Short NSN matches with the country not specified for either one or both numbers. $this->assertEquals(MatchType::SHORT_NSN_MATCH, $this->phoneUtil->isNumberMatch("+64 3 331-6005", "331 6005")); $this->assertEquals(MatchType::SHORT_NSN_MATCH, $this->phoneUtil->isNumberMatch("+64 3 331-6005", "tel:331-6005;phone-context=abc.nz")); $this->assertEquals(MatchType::SHORT_NSN_MATCH, $this->phoneUtil->isNumberMatch("+64 3 331-6005", "tel:331-6005;isub=1234;phone-context=abc.nz")); $this->assertEquals(MatchType::SHORT_NSN_MATCH, $this->phoneUtil->isNumberMatch("+64 3 331-6005", "tel:331-6005;isub=1234;phone-context=abc.nz;a=%A1")); // We did not know that the "0" was a national prefix since neither number has a country code, // so this is considered a SHORT_NSN_MATCH. $this->assertEquals(MatchType::SHORT_NSN_MATCH, $this->phoneUtil->isNumberMatch("3 331-6005", "03 331 6005")); $this->assertEquals(MatchType::SHORT_NSN_MATCH, $this->phoneUtil->isNumberMatch("3 331-6005", "331 6005")); $this->assertEquals(MatchType::SHORT_NSN_MATCH, $this->phoneUtil->isNumberMatch("3 331-6005", "tel:331-6005;phone-context=abc.nz")); $this->assertEquals(MatchType::SHORT_NSN_MATCH, $this->phoneUtil->isNumberMatch("3 331-6005", "+64 331 6005")); // Short NSN match with the country specified. $this->assertEquals(MatchType::SHORT_NSN_MATCH, $this->phoneUtil->isNumberMatch("03 331-6005", "331 6005")); $this->assertEquals(MatchType::SHORT_NSN_MATCH, $this->phoneUtil->isNumberMatch("1 234 345 6789", "345 6789")); $this->assertEquals(MatchType::SHORT_NSN_MATCH, $this->phoneUtil->isNumberMatch("+1 (234) 345 6789", "345 6789")); // NSN matches, country calling code omitted for one number, extension missing for one. $this->assertEquals(MatchType::SHORT_NSN_MATCH, $this->phoneUtil->isNumberMatch("+64 3 331-6005", "3 331 6005#1234")); // One has Italian leading zero, one does not. $italianNumberOne = new PhoneNumber(); $italianNumberOne->setCountryCode(39)->setNationalNumber(1234)->setItalianLeadingZero(true); $italianNumberTwo = new PhoneNumber(); $italianNumberTwo->setCountryCode(39)->setNationalNumber(1234); $this->assertEquals(MatchType::SHORT_NSN_MATCH, $this->phoneUtil->isNumberMatch($italianNumberOne, $italianNumberTwo)); // One has an extension, the other has an extension of "". $italianNumberOne->setExtension("1234")->clearItalianLeadingZero(); $italianNumberTwo->setExtension(""); $this->assertEquals(MatchType::SHORT_NSN_MATCH, $this->phoneUtil->isNumberMatch($italianNumberOne, $italianNumberTwo)); }
public function testSpecialCaseIndianMobile() { $fixedLineAndMobileNumber = new PhoneNumber(); $fixedLineAndMobileNumber->setCountryCode(91)->setNationalNumber(7290412345); $this->assertEquals(PhoneNumberType::FIXED_LINE_OR_MOBILE, $this->phoneUtil->getNumberType($fixedLineAndMobileNumber)); }
public function testParseNationalNumber() { // National prefix attached. $this->assertEquals(self::$nzNumber, $this->phoneUtil->parse("033316005", RegionCode::NZ)); $this->assertEquals(self::$nzNumber, $this->phoneUtil->parse("33316005", RegionCode::NZ)); // National prefix attached and some formatting present. $this->assertEquals(self::$nzNumber, $this->phoneUtil->parse("03-331 6005", RegionCode::NZ)); $this->assertEquals(self::$nzNumber, $this->phoneUtil->parse("03 331 6005", RegionCode::NZ)); // Testing international prefixes. // Should strip country calling code. $this->assertEquals(self::$nzNumber, $this->phoneUtil->parse("0064 3 331 6005", RegionCode::NZ)); // Try again, but this time we have an international number with Region Code US. It should // recognise the country calling code and parse accordingly. $this->assertEquals(self::$nzNumber, $this->phoneUtil->parse("01164 3 331 6005", RegionCode::US)); $this->assertEquals(self::$nzNumber, $this->phoneUtil->parse("+64 3 331 6005", RegionCode::US)); // We should ignore the leading plus here, since it is not followed by a valid country code but // instead is followed by the IDD for the US. $this->assertEquals(self::$nzNumber, $this->phoneUtil->parse("+01164 3 331 6005", RegionCode::US)); $this->assertEquals(self::$nzNumber, $this->phoneUtil->parse("+0064 3 331 6005", RegionCode::NZ)); $this->assertEquals(self::$nzNumber, $this->phoneUtil->parse("+ 00 64 3 331 6005", RegionCode::NZ)); $nzNumber = new PhoneNumber(); $nzNumber->setCountryCode(64)->setNationalNumber(64123456); $this->assertEquals($nzNumber, $this->phoneUtil->parse("64(0)64123456", RegionCode::NZ)); // Check that using a "/" is fine in a phone number. $this->assertEquals(self::$deNumber, $this->phoneUtil->parse("301/23456", RegionCode::DE)); $usNumber = new PhoneNumber(); // Check it doesn't use the '1' as a country calling code when parsing if the phone number was // already possible. $usNumber->setCountryCode(1)->setNationalNumber(1234567890); $this->assertEquals($usNumber, $this->phoneUtil->parse("123-456-7890", RegionCode::US)); // Test star numbers. Although this is not strictly valid, we would like to make sure we can // parse the output we produce when formatting the number. $this->assertEquals(self::$jpStarNumber, $this->phoneUtil->parse("+81 *2345", RegionCode::JP)); // Test national number bigger than max 32-bit signed integer $inNumber = new PhoneNumber(); $inNumber->setCountryCode(55)->setNationalNumber(9876543210); $this->assertEquals($inNumber, $this->phoneUtil->parse("9876543210", RegionCode::BR)); }
/** * Tries to extract a country calling code from a number. This method will return zero if no * country calling code is considered to be present. Country calling codes are extracted in the * following ways: * <ul> * <li> by stripping the international dialing prefix of the region the person is dialing from, * if this is present in the number, and looking at the next digits * <li> by stripping the '+' sign if present and then looking at the next digits * <li> by comparing the start of the number and the country calling code of the default region. * If the number is not considered possible for the numbering plan of the default region * initially, but starts with the country calling code of this region, validation will be * reattempted after stripping this country calling code. If this number is considered a * possible number, then the first digits will be considered the country calling code and * removed as such. * </ul> * It will throw a NumberParseException if the number starts with a '+' but the country calling * code supplied after this does not match that of any known region. * * @param string $number non-normalized telephone number that we wish to extract a country calling * code from - may begin with '+' * @param PhoneMetadata $defaultRegionMetadata metadata about the region this number may be from * @param string $nationalNumber a string buffer to store the national significant number in, in the case * that a country calling code was extracted. The number is appended to any existing contents. * If no country calling code was extracted, this will be left unchanged. * @param bool $keepRawInput true if the country_code_source and preferred_carrier_code fields of * phoneNumber should be populated. * @param PhoneNumber $phoneNumber the PhoneNumber object where the country_code and country_code_source need * to be populated. Note the country_code is always populated, whereas country_code_source is * only populated when keepCountryCodeSource is true. * @return int the country calling code extracted or 0 if none could be extracted * @throws NumberParseException */ public function maybeExtractCountryCode($number, PhoneMetadata $defaultRegionMetadata = null, &$nationalNumber, $keepRawInput, PhoneNumber $phoneNumber) { if (mb_strlen($number) == 0) { return 0; } $fullNumber = $number; // Set the default prefix to be something that will never match. $possibleCountryIddPrefix = "NonMatch"; if ($defaultRegionMetadata !== null) { $possibleCountryIddPrefix = $defaultRegionMetadata->getInternationalPrefix(); } $countryCodeSource = $this->maybeStripInternationalPrefixAndNormalize($fullNumber, $possibleCountryIddPrefix); if ($keepRawInput) { $phoneNumber->setCountryCodeSource($countryCodeSource); } if ($countryCodeSource != CountryCodeSource::FROM_DEFAULT_COUNTRY) { if (mb_strlen($fullNumber) <= self::MIN_LENGTH_FOR_NSN) { throw new NumberParseException(NumberParseException::TOO_SHORT_AFTER_IDD, "Phone number had an IDD, but after this was not " . "long enough to be a viable phone number."); } $potentialCountryCode = $this->extractCountryCode($fullNumber, $nationalNumber); if ($potentialCountryCode != 0) { $phoneNumber->setCountryCode($potentialCountryCode); return $potentialCountryCode; } // If this fails, they must be using a strange country calling code that we don't recognize, // or that doesn't exist. throw new NumberParseException(NumberParseException::INVALID_COUNTRY_CODE, "Country calling code supplied was not recognised."); } else { if ($defaultRegionMetadata !== null) { // Check to see if the number starts with the country calling code for the default region. If // so, we remove the country calling code, and do some checks on the validity of the number // before and after. $defaultCountryCode = $defaultRegionMetadata->getCountryCode(); $defaultCountryCodeString = (string) $defaultCountryCode; $normalizedNumber = (string) $fullNumber; if (strpos($normalizedNumber, $defaultCountryCodeString) === 0) { $potentialNationalNumber = substr($normalizedNumber, mb_strlen($defaultCountryCodeString)); $generalDesc = $defaultRegionMetadata->getGeneralDesc(); $validNumberPattern = $generalDesc->getNationalNumberPattern(); // Don't need the carrier code. $carriercode = null; $this->maybeStripNationalPrefixAndCarrierCode($potentialNationalNumber, $defaultRegionMetadata, $carriercode); $possibleNumberPattern = $generalDesc->getPossibleNumberPattern(); // If the number was not valid before but is valid now, or if it was too long before, we // consider the number with the country calling code stripped to be a better result and // keep that instead. if (preg_match('/^(' . $validNumberPattern . ')$/x', $fullNumber) == 0 && preg_match('/^(' . $validNumberPattern . ')$/x', $potentialNationalNumber) > 0 || $this->testNumberLengthAgainstPattern($possibleNumberPattern, (string) $fullNumber) == ValidationResult::TOO_LONG) { $nationalNumber .= $potentialNationalNumber; if ($keepRawInput) { $phoneNumber->setCountryCodeSource(CountryCodeSource::FROM_NUMBER_WITHOUT_PLUS_SIGN); } $phoneNumber->setCountryCode($defaultCountryCode); return $defaultCountryCode; } } } } // No country calling code present. $phoneNumber->setCountryCode(0); return 0; }
/** * Returns a text description for the given phone number, in the language provided. The * description might consist of the name of the country where the phone number is from, or the * name of the geographical area the phone number is from if more detailed information is * available. * * <p>This method assumes the validity of the number passed in has already been checked, and that * the number is suitable for geocoding. We consider fixed-line and mobile numbers possible * candidates for geocoding. * * <p>If $userRegion is set, we also consider the region of the user. If the phone number is from * the same region as the user, only a lower-level description will be returned, if one exists. * Otherwise, the phone number's region will be returned, with optionally some more detailed * information. * * <p>For example, for a user from the region "US" (United States), we would show "Mountain View, * CA" for a particular number, omitting the United States from the description. For a user from * the United Kingdom (region "GB"), for the same number we may show "Mountain View, CA, United * States" or even just "United States". * * @param PhoneNumber $number a valid phone number for which we want to get a text description * @param string $locale the language code for which the description should be written * @param string $userRegion the region code for a given user. This region will be omitted from the * description if the phone number comes from this region. It is a two-letter uppercase ISO * country code as defined by ISO 3166-1. * @return string a text description for the given language code for the given phone number */ public function getDescriptionForValidNumber(PhoneNumber $number, $locale, $userRegion = null) { // If the user region matches the number's region, then we just show the lower-level // description, if one exists - if no description exists, we will show the region(country) name // for the number. $regionCode = $this->phoneUtil->getRegionCodeForNumber($number); if ($userRegion == null || $userRegion == $regionCode) { $languageStr = Locale::getPrimaryLanguage($locale); $scriptStr = ""; $regionStr = Locale::getRegion($locale); $mobileToken = $this->phoneUtil->getCountryMobileToken($number->getCountryCode()); $nationalNumber = $this->phoneUtil->getNationalSignificantNumber($number); if ($mobileToken !== "" && !strncmp($nationalNumber, $mobileToken, strlen($mobileToken))) { // In some countries, eg. Argentina, mobile numbers have a mobile token before the national // destination code, this should be removed before geocoding. $nationalNumber = substr($nationalNumber, strlen($mobileToken)); $copiedNumber = new PhoneNumber(); $copiedNumber->setCountryCode($number->getCountryCode()); $copiedNumber->setNationalNumber($nationalNumber); if (substr($nationalNumber, 0, 1) == "0") { $copiedNumber->setItalianLeadingZero(true); } $areaDescription = $this->prefixFileReader->getDescriptionForNumber($copiedNumber, $languageStr, $scriptStr, $regionStr); } else { $areaDescription = $this->prefixFileReader->getDescriptionForNumber($number, $languageStr, $scriptStr, $regionStr); } return strlen($areaDescription) > 0 ? $areaDescription : $this->getCountryNameForNumber($number, $locale); } // Otherwise, we just show the region(country) name for now. return $this->getRegionDisplayName($regionCode, $locale); // TODO: Concatenate the lower-level and country-name information in an appropriate // way for each language. }