/** * 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(); }
/** * 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 (!HasValidRegionCode(regionCode, countryCallingCode, nationalSignificantNumber)) return nationalSignificantNumber; var userDefinedFormatsCopy = new List<NumberFormat>(userDefinedFormats.Count); foreach (var numFormat in userDefinedFormats) { var nationalPrefixFormattingRule = numFormat.NationalPrefixFormattingRule; if (nationalPrefixFormattingRule.Length > 0) { // 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. var numFormatCopy = new NumberFormat.Builder(); numFormatCopy.MergeFrom(numFormat); var nationalPrefix = GetMetadataForRegion(regionCode).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(); } userDefinedFormatsCopy.Add(numFormatCopy.Build()); } else { // Otherwise, we just add the original rule to the modified list of formats. userDefinedFormatsCopy.Add(numFormat); } } var formattedNumber = new StringBuilder(FormatAccordingToFormats(nationalSignificantNumber, userDefinedFormatsCopy, numberFormat)); MaybeGetFormattedExtension(number, regionCode, numberFormat, formattedNumber); FormatNumberByFormat(countryCallingCode, numberFormat, formattedNumber); return formattedNumber.ToString(); }