/**
* Formats a phone number in the specified format using client-defined formatting rules. Note that
* if the phone number has a country calling code of zero or an otherwise invalid country calling
* code, we cannot work out things like whether there should be a national prefix applied, or how
* to format extensions, so we return the national significant number with no formatting applied.
*
* @param number the phone number to be formatted
* @param numberFormat the format the phone number should be formatted into
* @param userDefinedFormats formatting rules specified by clients
* @return the formatted phone number
*/
public String FormatByPattern(PhoneNumber number, PhoneNumberFormat numberFormat,
List<NumberFormat> userDefinedFormats)
{
int countryCallingCode = number.CountryCode;
var nationalSignificantNumber = GetNationalSignificantNumber(number);
// Note getRegionCodeForCountryCode() is used because formatting information for regions which
// share a country calling code is contained by only one region for performance reasons. For
// example, for NANPA regions it will be contained in the metadata for US.
var regionCode = GetRegionCodeForCountryCode(countryCallingCode);
if (!HasValidCountryCallingCode(countryCallingCode))
return nationalSignificantNumber;
PhoneMetadata metadata = GetMetadataForRegionOrCallingCode(countryCallingCode, regionCode);
StringBuilder formattedNumber = new StringBuilder(20);
NumberFormat formattingPattern =
ChooseFormattingPatternForNumber(userDefinedFormats, nationalSignificantNumber);
if (formattingPattern == null)
{
// If no pattern above is matched, we format the number as a whole.
formattedNumber.Append(nationalSignificantNumber);
}
else
{
var numFormatCopy = new NumberFormat.Builder();
// Before we do a replacement of the national prefix pattern $NP with the national prefix, we
// need to copy the rule so that subsequent replacements for different numbers have the
// appropriate national prefix.
numFormatCopy.MergeFrom(formattingPattern);
String nationalPrefixFormattingRule = formattingPattern.NationalPrefixFormattingRule;
if (nationalPrefixFormattingRule.Length > 0)
{
String nationalPrefix = metadata.NationalPrefix;
if (nationalPrefix.Length > 0)
{
// Replace $NP with national prefix and $FG with the first group ($1).
nationalPrefixFormattingRule = NP_PATTERN.Replace(nationalPrefixFormattingRule, nationalPrefix, 1);
nationalPrefixFormattingRule = FG_PATTERN.Replace(nationalPrefixFormattingRule, "$$1", 1);
numFormatCopy.SetNationalPrefixFormattingRule(nationalPrefixFormattingRule);
}
else
{
// We don't want to have a rule for how to format the national prefix if there isn't one.
numFormatCopy.ClearNationalPrefixFormattingRule();
}
}
formattedNumber.Append(
FormatNsnUsingPattern(nationalSignificantNumber, numFormatCopy.Build(), numberFormat));
}
MaybeAppendFormattedExtension(number, metadata, numberFormat, formattedNumber);
PrefixNumberWithCountryCallingCode(countryCallingCode, numberFormat, formattedNumber);
return formattedNumber.ToString();
}