Skip to content

Commit 548cebe

Browse files
authored
Call chooseFormattingPatternForNumber only once in formatInOriginalFormat (#3976)
* Call chooseFormattingPatternForNumber only once in formatInOriginalFormat. This is a non-behavior change which optimizes memory usage on Android by decreasing the number of times a NumberFormat is chosen for a given PhoneNumber (which is expensive due to all the Matcher instantiations) * Call chooseFormattingPatternForNumber only once in formatInOriginalFormat. This is a non-behavior change which optimizes memory usage on Android by decreasing the number of times a NumberFormat is chosen for a given PhoneNumber (which is expensive due to all the Matcher instantiations)
1 parent a2f342d commit 548cebe

File tree

2 files changed

+22
-29
lines changed

2 files changed

+22
-29
lines changed

java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java

Lines changed: 21 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1656,7 +1656,8 @@ public String formatOutOfCountryCallingNumber(PhoneNumber number,
16561656
* @return the formatted phone number in its original number format
16571657
*/
16581658
public String formatInOriginalFormat(PhoneNumber number, String regionCallingFrom) {
1659-
if (number.hasRawInput() && !hasFormattingPatternForNumber(number)) {
1659+
NumberFormat formatRule = chooseFormattingPatternForNumber(number);
1660+
if (number.hasRawInput() && formatRule == null) {
16601661
// We check if we have the formatting pattern because without that, we might format the number
16611662
// as a group without national prefix.
16621663
return number.getRawInput();
@@ -1696,12 +1697,6 @@ public String formatInOriginalFormat(PhoneNumber number, String regionCallingFro
16961697
formattedNumber = nationalFormat;
16971698
break;
16981699
}
1699-
// Metadata cannot be null here because getNddPrefixForRegion() (above) returns null if
1700-
// there is no metadata for the region.
1701-
PhoneMetadata metadata = getMetadataForRegion(regionCode);
1702-
String nationalNumber = getNationalSignificantNumber(number);
1703-
NumberFormat formatRule =
1704-
chooseFormattingPatternForNumber(metadata.getNumberFormatList(), nationalNumber);
17051700
// The format rule could still be null here if the national number was 0 and there was no
17061701
// raw input (this should not be possible for numbers generated by the phonenumber library
17071702
// as they would also not have a country calling code and we would have exited earlier).
@@ -1770,18 +1765,32 @@ private boolean rawInputContainsNationalPrefix(String rawInput, String nationalP
17701765
return false;
17711766
}
17721767

1773-
private boolean hasFormattingPatternForNumber(PhoneNumber number) {
1768+
private NumberFormat chooseFormattingPatternForNumber(PhoneNumber number) {
17741769
int countryCallingCode = number.getCountryCode();
17751770
String phoneNumberRegion = getRegionCodeForCountryCode(countryCallingCode);
17761771
PhoneMetadata metadata =
17771772
getMetadataForRegionOrCallingCode(countryCallingCode, phoneNumberRegion);
17781773
if (metadata == null) {
1779-
return false;
1774+
return null;
17801775
}
17811776
String nationalNumber = getNationalSignificantNumber(number);
1782-
NumberFormat formatRule =
1783-
chooseFormattingPatternForNumber(metadata.getNumberFormatList(), nationalNumber);
1784-
return formatRule != null;
1777+
return chooseFormattingPatternForNumber(metadata.getNumberFormatList(), nationalNumber);
1778+
}
1779+
1780+
NumberFormat chooseFormattingPatternForNumber(List<NumberFormat> availableFormats,
1781+
String nationalNumber) {
1782+
for (NumberFormat numFormat : availableFormats) {
1783+
int size = numFormat.getLeadingDigitsPatternCount();
1784+
if (size == 0 || regexCache.getPatternForRegex(
1785+
// We always use the last leading_digits_pattern, as it is the most detailed.
1786+
numFormat.getLeadingDigitsPattern(size - 1)).matcher(nationalNumber).lookingAt()) {
1787+
Matcher m = regexCache.getPatternForRegex(numFormat.getPattern()).matcher(nationalNumber);
1788+
if (m.matches()) {
1789+
return numFormat;
1790+
}
1791+
}
1792+
}
1793+
return null;
17851794
}
17861795

17871796
/**
@@ -1970,22 +1979,6 @@ private String formatNsn(String number,
19701979
: formatNsnUsingPattern(number, formattingPattern, numberFormat, carrierCode);
19711980
}
19721981

1973-
NumberFormat chooseFormattingPatternForNumber(List<NumberFormat> availableFormats,
1974-
String nationalNumber) {
1975-
for (NumberFormat numFormat : availableFormats) {
1976-
int size = numFormat.getLeadingDigitsPatternCount();
1977-
if (size == 0 || regexCache.getPatternForRegex(
1978-
// We always use the last leading_digits_pattern, as it is the most detailed.
1979-
numFormat.getLeadingDigitsPattern(size - 1)).matcher(nationalNumber).lookingAt()) {
1980-
Matcher m = regexCache.getPatternForRegex(numFormat.getPattern()).matcher(nationalNumber);
1981-
if (m.matches()) {
1982-
return numFormat;
1983-
}
1984-
}
1985-
}
1986-
return null;
1987-
}
1988-
19891982
// Simple wrapper of formatNsnUsingPattern for the common case of no carrier code.
19901983
String formatNsnUsingPattern(String nationalNumber,
19911984
NumberFormat formattingPattern,

pending_code_changes.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1+
- Decreased the number of invocations of chooseFormattingPatternForNumber in PhoneNumberUtil#formatInOriginalFormat

0 commit comments

Comments
 (0)