@@ -1687,7 +1687,8 @@ public String formatOutOfCountryCallingNumber(PhoneNumber number,
16871687 * @return the formatted phone number in its original number format
16881688 */
16891689 public String formatInOriginalFormat (PhoneNumber number , String regionCallingFrom ) {
1690- if (number .hasRawInput () && !hasFormattingPatternForNumber (number )) {
1690+ NumberFormat formatRule = chooseFormattingPatternForNumber (number );
1691+ if (number .hasRawInput () && formatRule == null ) {
16911692 // We check if we have the formatting pattern because without that, we might format the number
16921693 // as a group without national prefix.
16931694 return number .getRawInput ();
@@ -1727,12 +1728,6 @@ public String formatInOriginalFormat(PhoneNumber number, String regionCallingFro
17271728 formattedNumber = nationalFormat ;
17281729 break ;
17291730 }
1730- // Metadata cannot be null here because getNddPrefixForRegion() (above) returns null if
1731- // there is no metadata for the region.
1732- PhoneMetadata metadata = getMetadataForRegion (regionCode );
1733- String nationalNumber = getNationalSignificantNumber (number );
1734- NumberFormat formatRule =
1735- chooseFormattingPatternForNumber (metadata .getNumberFormatList (), nationalNumber );
17361731 // The format rule could still be null here if the national number was 0 and there was no
17371732 // raw input (this should not be possible for numbers generated by the phonenumber library
17381733 // as they would also not have a country calling code and we would have exited earlier).
@@ -1801,18 +1796,32 @@ private boolean rawInputContainsNationalPrefix(String rawInput, String nationalP
18011796 return false ;
18021797 }
18031798
1804- private boolean hasFormattingPatternForNumber (PhoneNumber number ) {
1799+ private NumberFormat chooseFormattingPatternForNumber (PhoneNumber number ) {
18051800 int countryCallingCode = number .getCountryCode ();
18061801 String phoneNumberRegion = getRegionCodeForCountryCode (countryCallingCode );
18071802 PhoneMetadata metadata =
18081803 getMetadataForRegionOrCallingCode (countryCallingCode , phoneNumberRegion );
18091804 if (metadata == null ) {
1810- return false ;
1805+ return null ;
18111806 }
18121807 String nationalNumber = getNationalSignificantNumber (number );
1813- NumberFormat formatRule =
1814- chooseFormattingPatternForNumber (metadata .getNumberFormatList (), nationalNumber );
1815- return formatRule != null ;
1808+ return chooseFormattingPatternForNumber (metadata .getNumberFormatList (), nationalNumber );
1809+ }
1810+
1811+ NumberFormat chooseFormattingPatternForNumber (List <NumberFormat > availableFormats ,
1812+ String nationalNumber ) {
1813+ for (NumberFormat numFormat : availableFormats ) {
1814+ int size = numFormat .getLeadingDigitsPatternCount ();
1815+ if (size == 0 || regexCache .getPatternForRegex (
1816+ // We always use the last leading_digits_pattern, as it is the most detailed.
1817+ numFormat .getLeadingDigitsPattern (size - 1 )).matcher (nationalNumber ).lookingAt ()) {
1818+ Matcher m = regexCache .getPatternForRegex (numFormat .getPattern ()).matcher (nationalNumber );
1819+ if (m .matches ()) {
1820+ return numFormat ;
1821+ }
1822+ }
1823+ }
1824+ return null ;
18161825 }
18171826
18181827 /**
@@ -2001,22 +2010,6 @@ private String formatNsn(String number,
20012010 : formatNsnUsingPattern (number , formattingPattern , numberFormat , carrierCode );
20022011 }
20032012
2004- NumberFormat chooseFormattingPatternForNumber (List <NumberFormat > availableFormats ,
2005- String nationalNumber ) {
2006- for (NumberFormat numFormat : availableFormats ) {
2007- int size = numFormat .getLeadingDigitsPatternCount ();
2008- if (size == 0 || regexCache .getPatternForRegex (
2009- // We always use the last leading_digits_pattern, as it is the most detailed.
2010- numFormat .getLeadingDigitsPattern (size - 1 )).matcher (nationalNumber ).lookingAt ()) {
2011- Matcher m = regexCache .getPatternForRegex (numFormat .getPattern ()).matcher (nationalNumber );
2012- if (m .matches ()) {
2013- return numFormat ;
2014- }
2015- }
2016- }
2017- return null ;
2018- }
2019-
20202013 // Simple wrapper of formatNsnUsingPattern for the common case of no carrier code.
20212014 String formatNsnUsingPattern (String nationalNumber ,
20222015 NumberFormat formattingPattern ,
0 commit comments