summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShaopeng Jia <shaopengjia@google.com>2010-07-23 15:06:34 +0200
committerShaopeng Jia <shaopengjia@google.com>2010-07-23 15:27:33 +0200
commitdf19cbfb8a1e8720bae76bb763ab29622e057c42 (patch)
treee1c24bf2aa70fa80282e0b07f8912649126db1a4
parent4b7846722d1a5acb0577b07e98324f744f5e7942 (diff)
downloadlibphonenumber-df19cbfb8a1e8720bae76bb763ab29622e057c42.tar.gz
Major improvement in AsYouTypeFormatter to start formatting earlier. New
TrancateTooLongNumber functionality in PhoneNumberUtil. Also fixes formatByPattern and Japanese an Swedish AsYouTypeFormatter bugs. Change-Id: I2a912109ee74ba80987bc4bed6544714eefa3a5b
-rw-r--r--README.android2
-rw-r--r--java/resources/com/google/i18n/phonenumbers/BuildMetadataProtoFromXml.java85
-rw-r--r--java/resources/com/google/i18n/phonenumbers/proto/phonemetadata.proto31
-rw-r--r--java/resources/com/google/i18n/phonenumbers/src/PhoneNumberMetaData.xml2750
-rw-r--r--java/resources/com/google/i18n/phonenumbers/test/PhoneNumberMetaDataForTesting.xml405
-rw-r--r--java/src/com/google/i18n/phonenumbers/AsYouTypeFormatter.java325
-rw-r--r--java/src/com/google/i18n/phonenumbers/PhoneNumberMetadataProtobin97324 -> 100288 bytes
-rw-r--r--java/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java96
-rw-r--r--java/src/com/google/i18n/phonenumbers/Phonemetadata.java60
-rw-r--r--java/test/com/google/i18n/phonenumbers/AsYouTypeFormatterTest.java309
-rw-r--r--java/test/com/google/i18n/phonenumbers/PhoneNumberMetadataProtoForTestingbin6959 -> 8110 bytes
-rw-r--r--java/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java117
-rw-r--r--java/test/com/google/i18n/phonenumbers/RegexCacheTest.java2
13 files changed, 2876 insertions, 1306 deletions
diff --git a/README.android b/README.android
index c38a6c3c..4d937827 100644
--- a/README.android
+++ b/README.android
@@ -1,4 +1,4 @@
URL: http://code.google.com/p/libphonenumber/
-Version: r39
+Version: r42
License: Apache 2
Description: Google Phone Number Library.
diff --git a/java/resources/com/google/i18n/phonenumbers/BuildMetadataProtoFromXml.java b/java/resources/com/google/i18n/phonenumbers/BuildMetadataProtoFromXml.java
index 2d2a50d9..7043a34e 100644
--- a/java/resources/com/google/i18n/phonenumbers/BuildMetadataProtoFromXml.java
+++ b/java/resources/com/google/i18n/phonenumbers/BuildMetadataProtoFromXml.java
@@ -23,11 +23,9 @@ import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
import java.io.File;
import java.io.FileOutputStream;
-import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -35,7 +33,6 @@ import java.util.regex.Pattern;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
/**
* Tool to convert phone number metadata from the XML format to protocol buffer format. It is
@@ -55,37 +52,30 @@ public class BuildMetadataProtoFromXml {
private static final Logger LOGGER = Logger.getLogger(BuildMetadataProtoFromXml.class.getName());
private static Boolean liteBuild;
- public static void main(String[] args) {
+ public static void main(String[] args) throws Exception {
String inputFile = args[0];
String outputFile = args[1];
liteBuild = args.length > 2 && Boolean.getBoolean(args[2]);
File xmlFile = new File(inputFile);
- try {
- FileOutputStream output = new FileOutputStream(outputFile);
- DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
- DocumentBuilder builder = builderFactory.newDocumentBuilder();
- Document document = builder.parse(xmlFile);
- document.getDocumentElement().normalize();
- Element rootElement = document.getDocumentElement();
- NodeList territory = rootElement.getElementsByTagName("territory");
- PhoneMetadataCollection metadataCollection = new PhoneMetadataCollection();
- int numOfTerritories = territory.getLength();
- for (int i = 0; i < numOfTerritories; i++) {
- Element territoryElement = (Element) territory.item(i);
- String regionCode = territoryElement.getAttribute("id");
- PhoneMetadata metadata = loadCountryMetadata(regionCode, territoryElement);
- metadataCollection.addMetadata(metadata);
- }
- ObjectOutputStream out = new ObjectOutputStream(output);
- metadataCollection.writeExternal(out);
- out.close();
- } catch (IOException e) {
- LOGGER.log(Level.SEVERE, e.toString());
- } catch (SAXException e) {
- LOGGER.log(Level.SEVERE, e.toString());
- } catch (ParserConfigurationException e) {
- LOGGER.log(Level.SEVERE, e.toString());
+
+ FileOutputStream output = new FileOutputStream(outputFile);
+ DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder builder = builderFactory.newDocumentBuilder();
+ Document document = builder.parse(xmlFile);
+ document.getDocumentElement().normalize();
+ Element rootElement = document.getDocumentElement();
+ NodeList territory = rootElement.getElementsByTagName("territory");
+ PhoneMetadataCollection metadataCollection = new PhoneMetadataCollection();
+ int numOfTerritories = territory.getLength();
+ for (int i = 0; i < numOfTerritories; i++) {
+ Element territoryElement = (Element) territory.item(i);
+ String regionCode = territoryElement.getAttribute("id");
+ PhoneMetadata metadata = loadCountryMetadata(regionCode, territoryElement);
+ metadataCollection.addMetadata(metadata);
}
+ ObjectOutputStream out = new ObjectOutputStream(output);
+ metadataCollection.writeExternal(out);
+ out.close();
}
private static String validateRE(String regex) {
@@ -154,11 +144,16 @@ public class BuildMetadataProtoFromXml {
} else {
format.setDomesticCarrierCodeFormattingRule(carrierCodeFormattingRule);
}
- if (numberFormatElement.hasAttribute("leadingDigits")) {
- format.setLeadingDigits(validateRE(numberFormatElement.getAttribute("leadingDigits")));
- }
+ setLeadingDigitsPatterns(numberFormatElement, format);
format.setPattern(validateRE(numberFormatElement.getAttribute("pattern")));
- format.setFormat(validateRE(numberFormatElement.getFirstChild().getNodeValue()));
+ NodeList formatPattern = numberFormatElement.getElementsByTagName("format");
+ if (formatPattern.getLength() != 1) {
+ LOGGER.log(Level.SEVERE,
+ "Only one format pattern for a numberFormat element should be defined.");
+ throw new RuntimeException("Invalid number of format patterns for country: " +
+ regionCode.toString());
+ }
+ format.setFormat(validateRE(formatPattern.item(0).getFirstChild().getNodeValue()));
metadata.addNumberFormat(format);
}
}
@@ -169,11 +164,16 @@ public class BuildMetadataProtoFromXml {
for (int i = 0; i < numOfIntlFormatElements; i++) {
Element numberFormatElement = (Element) intlNumberFormatElements.item(i);
NumberFormat format = new NumberFormat();
- if (numberFormatElement.hasAttribute("leadingDigits")) {
- format.setLeadingDigits(validateRE(numberFormatElement.getAttribute("leadingDigits")));
- }
+ setLeadingDigitsPatterns(numberFormatElement, format);
format.setPattern(validateRE(numberFormatElement.getAttribute("pattern")));
- format.setFormat(validateRE(numberFormatElement.getFirstChild().getNodeValue()));
+ NodeList formatPattern = numberFormatElement.getElementsByTagName("format");
+ if (formatPattern.getLength() != 1) {
+ LOGGER.log(Level.SEVERE,
+ "Only one format pattern for a numberFormat element should be defined.");
+ throw new RuntimeException("Invalid number of format patterns for country: " +
+ regionCode.toString());
+ }
+ format.setFormat(validateRE(formatPattern.item(0).getFirstChild().getNodeValue()));
if (numberFormatElement.hasAttribute("carrierCodeFormattingRule")) {
format.setDomesticCarrierCodeFormattingRule(validateRE(
getDomesticCarrierCodeFormattingRuleFromElement(numberFormatElement,
@@ -204,6 +204,17 @@ public class BuildMetadataProtoFromXml {
return metadata;
}
+ private static void setLeadingDigitsPatterns(Element numberFormatElement, NumberFormat format) {
+ NodeList leadingDigitsPatternNodes = numberFormatElement.getElementsByTagName("leadingDigits");
+ int numOfLeadingDigitsPatterns = leadingDigitsPatternNodes.getLength();
+ if (numOfLeadingDigitsPatterns > 0) {
+ for (int i = 0; i < numOfLeadingDigitsPatterns; i++) {
+ format.addLeadingDigitsPattern(
+ validateRE((leadingDigitsPatternNodes.item(i)).getFirstChild().getNodeValue()));
+ }
+ }
+ }
+
private static String getNationalPrefixFormattingRuleFromElement(Element element,
String nationalPrefix) {
String nationalPrefixFormattingRule = element.getAttribute("nationalPrefixFormattingRule");
diff --git a/java/resources/com/google/i18n/phonenumbers/proto/phonemetadata.proto b/java/resources/com/google/i18n/phonenumbers/proto/phonemetadata.proto
index 6c30e14b..b3486abf 100644
--- a/java/resources/com/google/i18n/phonenumbers/proto/phonemetadata.proto
+++ b/java/resources/com/google/i18n/phonenumbers/proto/phonemetadata.proto
@@ -40,13 +40,21 @@ message NumberFormat {
// regex specified by pattern.
required string format = 2;
- // leadingDigits is a regex that is used to match up to the first four digits
- // of the national (significant) number. When the match is successful, the
- // accompanying pattern and format should be used to format this number. For
- // example, if leading_digits="[1-3]|44", then all the national numbers
- // starting with 1, 2, 3 or 44 should be formatted using the accompanying
- // pattern and format.
- optional string leading_digits = 3;
+ // This field is a regex that is used to match a certain number of digits
+ // at the beginning of the national (significant) number. When the match is
+ // successful, the accompanying pattern and format should be used to format
+ // this number. For example, if leading_digits="[1-3]|44", then all the
+ // national numbers starting with 1, 2, 3 or 44 should be formatted using the
+ // accompanying pattern and format.
+ //
+ // The first leadingDigitsPattern matches up to the first three digits of the
+ // national (significant) number; the next one matches the first four digits,
+ // then the first five and so on, until the leadingDigitsPattern can uniquely
+ // identify one pattern and format to be used to format the number.
+ //
+ // In the case when only one formatting pattern exists, no
+ // leading_digits_pattern is needed.
+ repeated string leading_digits_pattern = 3;
// This field specifies how the national prefix ($NP) together with the first
// group ($FG) in the national significant number should be formatted in
@@ -178,15 +186,6 @@ message PhoneMetadata {
// - just the ideal way we would like to format it for them. When this element
// is absent, the national significant number will be formatted as a whole
// without any formatting applied.
- //
- // When formatting, the library goes through the list of formats from the
- // beginning and the first successful match is used to do the formatting.
- // A match is successful if the phone number being formatted starts with
- // digits matching the leadingDigits and the number itself matches the
- // corresponding pattern. However, AsYouTypeFormatter goes through the whole
- // list and selects formats whose leadingDigits match what has been typed
- // so far. Therefore, having more specific leadingDigits improves the
- // performance of AsYouTypeFormatter in terms of speed.
repeated NumberFormat number_format = 19;
// This field is populated only when the national significant number is
diff --git a/java/resources/com/google/i18n/phonenumbers/src/PhoneNumberMetaData.xml b/java/resources/com/google/i18n/phonenumbers/src/PhoneNumberMetaData.xml
index 1958cea2..b27b5347 100644
--- a/java/resources/com/google/i18n/phonenumbers/src/PhoneNumberMetaData.xml
+++ b/java/resources/com/google/i18n/phonenumbers/src/PhoneNumberMetaData.xml
@@ -48,8 +48,10 @@
<!ELEMENT nationalNumberPattern (#PCDATA)>
<!ELEMENT possibleNumberPattern (#PCDATA)>
<!ELEMENT exampleNumber (#PCDATA)>
- <!ELEMENT numberFormat (#PCDATA)>
- <!ELEMENT intlNumberFormat (#PCDATA)>
+ <!ELEMENT numberFormat (leadingDigits*, format)>
+ <!ELEMENT intlNumberFormat (leadingDigits*, format)>
+ <!ELEMENT format (#PCDATA)>
+ <!ELEMENT leadingDigits (#PCDATA)>
<!ATTLIST territory id CDATA #REQUIRED>
<!ATTLIST territory countryCode CDATA #REQUIRED>
@@ -65,9 +67,7 @@
<!ATTLIST territory carrierCodeFormattingRule CDATA #IMPLIED>
<!ATTLIST numberFormat nationalPrefixFormattingRule CDATA #IMPLIED>
<!ATTLIST numberFormat carrierCodeFormattingRule CDATA #IMPLIED>
- <!ATTLIST numberFormat leadingDigits CDATA #IMPLIED>
<!ATTLIST numberFormat pattern CDATA #REQUIRED>
- <!ATTLIST intlNumberFormat leadingDigits CDATA #IMPLIED>
<!ATTLIST intlNumberFormat pattern CDATA #REQUIRED>
<!ATTLIST intlNumberFormat carrierCodeFormattingRule CDATA #IMPLIED>
]>
@@ -78,8 +78,14 @@
<!-- http://www.itu.int/oth/T0202000005/en -->
<territory id="AD" countryCode="376" internationalPrefix="00">
<availableFormats>
- <numberFormat leadingDigits="[346-9]" pattern="(\d{3})(\d{3})">$1 $2</numberFormat>
- <numberFormat leadingDigits="1" pattern="(180[02])(\d{4})">$1 $2</numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})">
+ <leadingDigits>[346-9]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(180[02])(\d{4})">
+ <leadingDigits>1</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>(?:[346-9]|180)\d{5}</nationalNumberPattern>
@@ -118,12 +124,22 @@
<territory id="AE" countryCode="971" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="[2-4679][2-8]"
- pattern="([2-4679])(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="5" pattern="(5[056])(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[4679]0"
- pattern="([4679]00)(\d)(\d{5})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="8" pattern="(800)(\d{2})(\d{0,7})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([2-4679])(\d{3})(\d{4})">
+ <leadingDigits>[2-4679][2-8]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(5[056])(\d{3})(\d{4})">
+ <leadingDigits>5</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([4679]00)(\d)(\d{5})">
+ <leadingDigits>[4679]0</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(800)(\d{2})(\d{0,7})">
+ <leadingDigits>8</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2-79]\d{7,8}|800\d{2,9}</nationalNumberPattern>
@@ -161,7 +177,9 @@
<territory id="AF" countryCode="93" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat pattern="([2-7]\d)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([2-7]\d)(\d{3})(\d{4})">
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2-7]\d{8}</nationalNumberPattern>
@@ -249,17 +267,22 @@
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
<!-- Formats mostly follow http://tirana.usembassy.gov/list_of_doctors.html -->
- <numberFormat leadingDigits="4[0-6]"
- pattern="(4)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="6"
- pattern="(6[6-9])(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[2358][2-5]|4[7-9]"
- pattern="(\d{2})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[2358][16-9]"
- pattern="(\d{3})(\d{5})">$1 $2</numberFormat>
- <numberFormat leadingDigits="800" pattern="(800)(\d{4})">$1 $2</numberFormat>
- <numberFormat leadingDigits="9|808" pattern="(\d{3})(\d{3})">$1 $2</numberFormat>
- <numberFormat leadingDigits="7" pattern="(700)(\d{5})">$1 $2</numberFormat>
+ <numberFormat pattern="(4)(\d{3})(\d{4})">
+ <leadingDigits>4[0-6]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(6[6-9])(\d{3})(\d{4})">
+ <leadingDigits>6</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{3})(\d{3})">
+ <leadingDigits>[2358][2-5]|4[7-9]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3,5})">
+ <leadingDigits>[235][16-9]|8[016-9]|[79]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2-57]\d{7}|6\d{8}|8\d{5,7}|9\d{5}</nationalNumberPattern>
@@ -313,7 +336,9 @@
<!-- http://www.itu.int/oth/T0202000006/en -->
<territory id="AO" countryCode="244" internationalPrefix="00">
<availableFormats>
- <numberFormat pattern="(\d{3})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{3})">
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[29]\d{8}</nationalNumberPattern>
@@ -337,38 +362,70 @@
nationalPrefix="0" nationalPrefixForParsing="0(?:(11|2(?:2(?:02?|[13]|2[13-79]|4[1-6]|5[2457]|6[124-8]|7[1-4]|8[13-6]|9[1-367])|3(?:[06]2|1[467]|2[02-6]|3[13-8]|[49][2-6]|5[2-8]|7)|47[3-578]|6(?:1|2[2-7]|4[6-8]?|5[125-8])|9(?:0[1-3]|[19]|2\d|3[1-6]|4[0-24-68]|5[2-4]|6[2-6]|72?|8[23]?))|3(?:3(?:2[79]|8[2578])|4(?:0[124-9]|[12]|3[5-8]?|4[24-7]|5[4-68]?|6\d|7[126]|8[237-9]|9[1-36-8])|5(?:1|2[1245]|3[2-4]?|4[1-46-9]|6[2-4]|7[1-6]|8[2-5]?)|7(?:1[15-8]|2[125]|3[1245]|4[13]|5[124-8]|7[2-57]|8[1-36])|8(?:1|2[125-7]|3[23578]|4[13-6]|5[4-8]?|6[1-357-9]|7[5-8]?|8[4-7]?|9[124])))15)?"
nationalPrefixTransformRule="9$1" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="[68]"
- pattern="([68]\d{2})(\d{3})(\d{4})">$1-$2-$3</numberFormat>
- <intlNumberFormat leadingDigits="[68]"
- pattern="([68]\d{2})(\d{3})(\d{4})">$1-$2-$3</intlNumberFormat>
- <numberFormat leadingDigits="91" pattern="9(11)(\d{4})(\d{4})">$1 15-$2-$3</numberFormat>
- <intlNumberFormat leadingDigits="91"
- pattern="9(11)(\d{4})(\d{4})">9 $1 $2-$3</intlNumberFormat>
- <numberFormat leadingDigits="9(?:2(?:2[013]|37|6[14]|9[179])|3(?:4[1235]|5[138]|8[1578]))"
- pattern="9(\d{3})(\d{3})(\d{4})">$1 15-$2-$3</numberFormat>
- <intlNumberFormat
- leadingDigits="9(?:2(?:2[013]|37|6[14]|9[179])|3(?:4[1235]|5[138]|8[1578]))"
- pattern="9(\d{3})(\d{3})(\d{4})">9 $1 $2-$3</intlNumberFormat>
- <numberFormat
- leadingDigits="9(?:2(?:2[24-9]|3[0-69]|47|6[25]|9[02-68])|3(?:3[28]|4[046-9]|5[2467]|7[1-578]|8[23469]))"
- pattern="9(\d{4})(\d{2})(\d{4})">$1 15-$2-$3</numberFormat>
- <intlNumberFormat
- leadingDigits="9(?:2(?:2[24-9]|3[0-69]|47|6[25]|9[02-68])|3(?:3[28]|4[046-9]|5[2467]|7[1-578]|8[23469]))"
- pattern="9(\d{4})(\d{2})(\d{4})">9 $1 $2-$3</intlNumberFormat>
- <numberFormat leadingDigits="1" pattern="(11)(\d{4})(\d{4})">$1 $2-$3</numberFormat>
- <intlNumberFormat leadingDigits="1"
- pattern="(11)(\d{4})(\d{4})">$1 $2-$3</intlNumberFormat>
+ <numberFormat pattern="([68]\d{2})(\d{3})(\d{4})">
+ <leadingDigits>[68]</leadingDigits>
+ <format>$1-$2-$3</format>
+ </numberFormat>
+ <intlNumberFormat pattern="([68]\d{2})(\d{3})(\d{4})">
+ <leadingDigits>[68]</leadingDigits>
+ <format>$1-$2-$3</format>
+ </intlNumberFormat>
+ <numberFormat pattern="9(11)(\d{4})(\d{4})">
+ <leadingDigits>91</leadingDigits>
+ <format>$1 15-$2-$3</format>
+ </numberFormat>
+ <intlNumberFormat pattern="9(11)(\d{4})(\d{4})">
+ <leadingDigits>91</leadingDigits>
+ <format>9 $1 $2-$3</format>
+ </intlNumberFormat>
+ <numberFormat pattern="9(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>9(?:2[2369]|3[458])</leadingDigits>
+ <leadingDigits>9(?:2(?:2[013]|37|6[14]|9[179])|3(?:4[1235]|5[138]|8[1578]))</leadingDigits>
+ <format>$1 15-$2-$3</format>
+ </numberFormat>
+ <intlNumberFormat pattern="9(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>9(?:2[2369]|3[458])</leadingDigits>
+ <leadingDigits>9(?:2(?:2[013]|37|6[14]|9[179])|3(?:4[1235]|5[138]|8[1578]))</leadingDigits>
+ <format>9 $1 $2-$3</format>
+ </intlNumberFormat>
+ <numberFormat pattern="9(\d{4})(\d{2})(\d{4})">
+ <leadingDigits>9(?:2[2-469]|3[3-578])</leadingDigits>
+ <leadingDigits>9(?:2(?:2[24-9]|3[0-69]|47|6[25]|9[02-68])|3(?:3[28]|4[046-9]|5[2467]|7[1-578]|8[23469]))</leadingDigits>
+ <format>$1 15-$2-$3</format>
+ </numberFormat>
+ <intlNumberFormat pattern="9(\d{4})(\d{2})(\d{4})">
+ <leadingDigits>9(?:2[2-469]|3[3-578])</leadingDigits>
+ <leadingDigits>9(?:2(?:2[24-9]|3[0-69]|47|6[25]|9[02-68])|3(?:3[28]|4[046-9]|5[2467]|7[1-578]|8[23469]))</leadingDigits>
+ <format>9 $1 $2-$3</format>
+ </intlNumberFormat>
+ <numberFormat pattern="(11)(\d{4})(\d{4})">
+ <leadingDigits>1</leadingDigits>
+ <format>$1 $2-$3</format>
+ </numberFormat>
+ <intlNumberFormat pattern="(11)(\d{4})(\d{4})">
+ <leadingDigits>1</leadingDigits>
+ <format>$1 $2-$3</format>
+ </intlNumberFormat>
<!-- Some 4-digit area codes actually are caught by this
rule. I'm giving however preference to the 3-digit area
codes, since they are considerably larger
communities. -->
- <numberFormat leadingDigits="2(?:2[013]|37|6[14]|9[179])|3(?:4[1235]|5[138]|8[1578])"
- pattern="(\d{3})(\d{3})(\d{4})">$1 $2-$3</numberFormat>
- <intlNumberFormat leadingDigits="2(?:2[013]|37|6[14]|9[179])|3(?:4[1235]|5[138]|8[1578])"
- pattern="(\d{3})(\d{3})(\d{4})">$1 $2-$3</intlNumberFormat>
- <numberFormat leadingDigits="[23]" pattern="(\d{4})(\d{2})(\d{4})">$1 $2-$3</numberFormat>
- <intlNumberFormat leadingDigits="[23]"
- pattern="(\d{4})(\d{2})(\d{4})">$1 $2-$3</intlNumberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>2(?:2[013]|37|6[14]|9[179])|3(?:4[1235]|5[138]|8[1578])</leadingDigits>
+ <format>$1 $2-$3</format>
+ </numberFormat>
+ <intlNumberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>2(?:2[013]|37|6[14]|9[179])|3(?:4[1235]|5[138]|8[1578])</leadingDigits>
+ <format>$1 $2-$3</format>
+ </intlNumberFormat>
+ <numberFormat pattern="(\d{4})(\d{2})(\d{4})">
+ <leadingDigits>[23]</leadingDigits>
+ <format>$1 $2-$3</format>
+ </numberFormat>
+ <intlNumberFormat pattern="(\d{4})(\d{2})(\d{4})">
+ <leadingDigits>[23]</leadingDigits>
+ <format>$1 $2-$3</format>
+ </intlNumberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-9]\d{9,11}</nationalNumberPattern>
@@ -431,12 +488,18 @@
<territory id="AT" countryCode="43" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="1|5[079]" pattern="([15])(\d{3,12})">$1 $2</numberFormat>
- <numberFormat leadingDigits="316|46|51|732|6(?:44|5[0-3579]|[6-9])|7(?:1|[28]0)|[89]"
- pattern="(\d{3})(\d{3,10})">$1 $2</numberFormat>
- <numberFormat
- leadingDigits="2|3(?:1[1-578]|[3-8])|4[2378]|5[2-6]|6(?:[12]|4[1-35-9]|5[468])|7(?:2[1-8]|35|4[1-8]|[57-9])"
- pattern="(\d{4})(\d{3,9})">$1 $2</numberFormat>
+ <numberFormat pattern="([15])(\d{3,12})">
+ <leadingDigits>1|5[079]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3,10})">
+ <leadingDigits>316|46|51|732|6(?:44|5[0-3579]|[6-9])|7(?:1|[28]0)|[89]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{4})(\d{3,9})">
+ <leadingDigits>2|3(?:1[1-578]|[3-8])|4[2378]|5[2-6]|6(?:[12]|4[1-35-9]|5[468])|7(?:2[1-8]|35|4[1-8]|[57-9])</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>\d{4,13}</nationalNumberPattern>
@@ -489,23 +552,40 @@
internationalPrefix="(?:14(?:1[14]|34|4[17]|[56]6|7[47]|88))?001[14-689]"
nationalPrefix="0">
<availableFormats>
- <numberFormat leadingDigits="[2378]"
- nationalPrefixFormattingRule="($NP$FG)"
- pattern="([2378])(\d{4})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="4"
- nationalPrefixFormattingRule="$NP$FG"
- pattern="(4\d{2})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="5"
- nationalPrefixFormattingRule="$NP$FG"
- pattern="(5[05]0)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="1(?:[38]00|9)" nationalPrefixFormattingRule="$FG"
- pattern="(1[389]\d{2})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat nationalPrefixFormattingRule="($NP$FG)"
+ pattern="([2378])(\d{4})(\d{4})">
+ <leadingDigits>[2378]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$NP$FG"
+ pattern="(4\d{2})(\d{3})(\d{3})">
+ <leadingDigits>4</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$NP$FG"
+ pattern="(5[05]0)(\d{3})(\d{3})">
+ <leadingDigits>5</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$FG"
+ pattern="(1[389]\d{2})(\d{3})(\d{3})">
+ <leadingDigits>1(?:[38]0|9)</leadingDigits>
+ <leadingDigits>1(?:[38]00|9)</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
<!-- Although the national plan doesn't explicitly say so, there is no evidence that a
180 xxxx number could be 180 0xxx. -->
- <numberFormat leadingDigits="180[1-9]" nationalPrefixFormattingRule="$FG"
- pattern="(180)(\d{4})">$1 $2</numberFormat>
- <numberFormat leadingDigits="13[1-9]" nationalPrefixFormattingRule="$FG"
- pattern="(13)(\d{2})(\d{2})">$1 $2 $3</numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$FG"
+ pattern="(180)(\d{4})">
+ <leadingDigits>180</leadingDigits>
+ <leadingDigits>180[1-9]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$FG"
+ pattern="(13)(\d{2})(\d{2})">
+ <leadingDigits>13[1-9]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-578]\d{5,9}</nationalNumberPattern>
@@ -554,7 +634,9 @@
<!-- http://www.itu.int/oth/T020200000B/en -->
<territory id="AW" countryCode="297" internationalPrefix="00">
<availableFormats>
- <numberFormat pattern="([5-9]\d{2})(\d{4})">$1 $2</numberFormat>
+ <numberFormat pattern="([5-9]\d{2})(\d{4})">
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[5-9]\d{6}</nationalNumberPattern>
@@ -585,12 +667,14 @@
<!-- http://www.itu.int/dms_pub/itu-t/oth/02/02/T020200000F0001MSWE.doc -->
<territory id="AZ" countryCode="994" internationalPrefix="00">
<availableFormats>
- <numberFormat leadingDigits="[4-8]"
- pattern="([4-8]\d)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="1[28]|22"
- pattern="([12]\d)(\d{3})(\d{3,4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="1[013-79]|2[013-9]"
- pattern="([12]\d{2})(\d{5})">$1 $2</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{3})(\d{3,4})">
+ <leadingDigits>1[28]|22|[4-8]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([12]\d{2})(\d{5})">
+ <leadingDigits>1[013-79]|2[013-9]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[124-8]\d{7,8}</nationalNumberPattern>
@@ -618,7 +702,9 @@
<territory id="BA" countryCode="387" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat pattern="([3-689]\d)(\d{3})(\d{3})">$1 $2-$3</numberFormat>
+ <numberFormat pattern="([3-689]\d)(\d{3})(\d{3})">
+ <format>$1 $2-$3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[3-689]\d{7}</nationalNumberPattern>
@@ -691,10 +777,22 @@
preferredInternationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="2" pattern="(2)(\d{7})">$1 $2</numberFormat>
- <numberFormat leadingDigits="[3-79]1" pattern="(\d{2})(\d{4,6})">$1 $2</numberFormat>
- <numberFormat leadingDigits="[3-79][2-9]|8" pattern="(\d{3})(\d{3,7})">$1 $2</numberFormat>
- <numberFormat leadingDigits="1" pattern="(\d{4})(\d{6})">$1 $2</numberFormat>
+ <numberFormat pattern="(2)(\d{7})">
+ <leadingDigits>2</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{4,6})">
+ <leadingDigits>[3-79]1</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3,7})">
+ <leadingDigits>[3-79][2-9]|8</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{4})(\d{6})">
+ <leadingDigits>1</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<!-- This is quite complex so we can define that numbers beginning with
@@ -740,16 +838,22 @@
<territory id="BE" countryCode="32" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="4[7-9]"
- pattern="(4[7-9]\d)(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
- <numberFormat leadingDigits="[23]|[49][23]"
- pattern="([2-49])(\d{3})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
- <numberFormat leadingDigits="[156]|7[18]|8(?:0[1-9]|[1-79])"
- pattern="([15-8]\d)(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
- <numberFormat leadingDigits="(?:80|9)0"
- pattern="([89]\d{2})(\d{2})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="7[07]"
- pattern="(7[07])(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="(4[7-9]\d)(\d{2})(\d{2})(\d{2})">
+ <leadingDigits>4[7-9]</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
+ <numberFormat pattern="([2-49])(\d{3})(\d{2})(\d{2})">
+ <leadingDigits>[23]|[49][23]</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
+ <numberFormat pattern="([15-8]\d)(\d{2})(\d{2})(\d{2})">
+ <leadingDigits>[156]|7[0178]|8(?:0[1-9]|[1-79])</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
+ <numberFormat pattern="([89]\d{2})(\d{2})(\d{3})">
+ <leadingDigits>(?:80|9)0</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-9]\d{7,8}</nationalNumberPattern>
@@ -785,7 +889,9 @@
<availableFormats>
<!-- The national numbering plan from ITU suggests grouping of 2, 2 and 4, but
we have chosen to use the standard from numbers found on the internet instead.-->
- <numberFormat pattern="(\d{2})(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{2})(\d{2})(\d{2})">
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2457]\d{7}</nationalNumberPattern>
@@ -809,14 +915,22 @@
<territory id="BG" countryCode="359" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="2" pattern="(2)(\d{3})(\d{3,4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="43[1-6]" pattern="(43[1-6])(\d{4,5})">$1 $2</numberFormat>
- <numberFormat leadingDigits="[35-7]|4[124-7]|8[1-6]|9[1-7]"
- pattern="(\d{2})(\d{2,3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="8[7-9]|98"
- pattern="([89]\d)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="48|90" pattern="([49]\d)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="43[0789]|800" pattern="(\d{3})(\d{5})">$1 $2</numberFormat>
+ <numberFormat pattern="(2)(\d{3})(\d{3,4})">
+ <leadingDigits>2</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{4,5})">
+ <leadingDigits>43|800</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{2,3})(\d{3})">
+ <leadingDigits>[35-7]|4[124-7]|8[1-6]|9[1-7]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{3})(\d{3,4})">
+ <leadingDigits>48|8[7-9]|9[08]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-9]\d{6,8}</nationalNumberPattern>
@@ -853,7 +967,9 @@
<territory id="BI" countryCode="257" internationalPrefix="00">
<availableFormats>
<numberFormat
- pattern="([27]\d)(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
+ pattern="([27]\d)(\d{2})(\d{2})(\d{2})">
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[27]\d{7}</nationalNumberPattern>
@@ -878,7 +994,9 @@
<!-- http://www.itu.int/oth/T0202000017/en -->
<territory id="BJ" countryCode="229" internationalPrefix="00">
<availableFormats>
- <numberFormat pattern="(\d{2})(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{2})(\d{2})(\d{2})">
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
<!-- Numbers beginning with 7 should be formatted as a block. -->
</availableFormats>
<generalDesc>
@@ -980,7 +1098,9 @@
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<!-- Format is from http://aiti.gov.bn/contact.html-->
<availableFormats>
- <numberFormat pattern="([2-578]\d{2})(\d{4})">$1 $2</numberFormat>
+ <numberFormat pattern="([2-578]\d{2})(\d{4})">
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2-578]\d{6}</nationalNumberPattern>
@@ -1014,13 +1134,22 @@
a nationalTransformRule to repopulate with the number without the carrier
code.-->
<availableFormats>
- <numberFormat leadingDigits="[1-9][1-9]"
- pattern="(\d{2})(\d{4})(\d{4})"
- nationalPrefixFormattingRule="($FG)"
- carrierCodeFormattingRule="$NP $CC $FG">$1 $2-$3</numberFormat>
- <numberFormat leadingDigits="400|3003" pattern="([34]00\d)(\d{4})">$1-$2</numberFormat>
- <numberFormat leadingDigits="[3589]00" nationalPrefixFormattingRule="$NP$FG"
- pattern="([3589]00)(\d{2,3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat nationalPrefixFormattingRule="($FG)"
+ pattern="(\d{2})(\d{4})(\d{4})"
+ carrierCodeFormattingRule="$NP $CC $FG">
+ <leadingDigits>[1-9][1-9]</leadingDigits>
+ <format>$1 $2-$3</format>
+ </numberFormat>
+ <numberFormat pattern="([34]00\d)(\d{4})">
+ <leadingDigits>[34]00</leadingDigits>
+ <leadingDigits>400|3003</leadingDigits>
+ <format>$1-$2</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$NP$FG"
+ pattern="([3589]00)(\d{2,3})(\d{4})">
+ <leadingDigits>[3589]00</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-9]\d{7,9}</nationalNumberPattern>
@@ -1083,14 +1212,18 @@
<!-- Bhutan -->
<!-- http://www.itu.int/oth/T0202000019/en -->
<territory id="BT" countryCode="975" internationalPrefix="00">
- <availableFormats>
- <!-- Format is from
- http://www.tourism.gov.bt/tour-operators/bhutan-abbot-tours-and-travels.html -->
- <numberFormat leadingDigits="1"
- pattern="(17)(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
- <numberFormat leadingDigits="[2-8]"
- pattern="([2-8])(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- </availableFormats>
+ <availableFormats>
+ <!-- Format is from
+ http://www.tourism.gov.bt/tour-operators/bhutan-abbot-tours-and-travels.html -->
+ <numberFormat pattern="(17)(\d{2})(\d{2})(\d{2})">
+ <leadingDigits>1</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
+ <numberFormat pattern="([2-8])(\d{3})(\d{3})">
+ <leadingDigits>[2-8]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ </availableFormats>
<generalDesc>
<nationalNumberPattern>(?:17|[2-8])\d{6}</nationalNumberPattern>
<possibleNumberPattern>\d{6,8}</possibleNumberPattern>
@@ -1112,9 +1245,14 @@
<!-- http://www.itu.int/dms_pub/itu-t/oth/02/02/T020200001C0001MSWE.doc -->
<territory id="BW" countryCode="267" internationalPrefix="00">
<availableFormats>
- <numberFormat leadingDigits="7"
- pattern="(7[1-4])(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="9" pattern="(90)(\d{5})">$1 $2</numberFormat>
+ <numberFormat pattern="(7[1-4])(\d{3})(\d{3})">
+ <leadingDigits>7</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(90)(\d{5})">
+ <leadingDigits>9</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2-9]\d{6,7}</nationalNumberPattern>
@@ -1148,12 +1286,16 @@
<territory id="BY" countryCode="375" internationalPrefix="8~10"
nationalPrefixForParsing="80?" nationalPrefix="8">
<availableFormats>
- <numberFormat leadingDigits="[1-4]"
- nationalPrefixFormattingRule="$NP 0$FG"
- pattern="([1-4]\d)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[89]"
- nationalPrefixFormattingRule="$NP $FG"
- pattern="([89]\d{2})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$NP 0$FG"
+ pattern="([1-4]\d)(\d{3})(\d{4})">
+ <leadingDigits>[1-4]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$NP $FG"
+ pattern="([89]\d{2})(\d{3})(\d{4})">
+ <leadingDigits>[89]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[12-4]\d{8}|[89]\d{9}</nationalNumberPattern>
@@ -1222,10 +1364,14 @@
<territory id="CD" countryCode="243" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="[89]"
- pattern="([89]\d{2})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[1-6]"
- pattern="([1-6]\d)(\d{5})">$1 $2</numberFormat>
+ <numberFormat pattern="([89]\d{2})(\d{3})(\d{3})">
+ <leadingDigits>[89]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([1-6]\d)(\d{5})">
+ <leadingDigits>[1-6]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[89]\d{8}|[1-6]\d{6}</nationalNumberPattern>
@@ -1247,7 +1393,9 @@
<!-- http://www.itu.int/oth/T0202000028/en -->
<territory id="CF" countryCode="236" internationalPrefix="00">
<availableFormats>
- <numberFormat pattern="(\d{2})(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{2})(\d{2})(\d{2})">
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[278]\d{7}</nationalNumberPattern>
@@ -1271,7 +1419,9 @@
<!-- http://www.itu.int/oth/T020200002E/en -->
<territory id="CG" countryCode="242" internationalPrefix="00">
<availableFormats>
- <numberFormat pattern="(\d{3})(\d{4})">$1 $2</numberFormat>
+ <numberFormat pattern="(\d{3})(\d{4})">
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[24-68]\d{6}</nationalNumberPattern>
@@ -1296,12 +1446,14 @@
<territory id="CH" countryCode="41" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="[2-6]|[7-9]1"
- pattern="([2-9]\d)(\d{3})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
- <numberFormat leadingDigits="7[46-9]"
- pattern="(7[46-9])(\d{3})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
- <numberFormat leadingDigits="8[047]|90"
- pattern="([89]\d{2})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([2-9]\d)(\d{3})(\d{2})(\d{2})">
+ <leadingDigits>[2-7]|[89]1</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
+ <numberFormat pattern="([89]\d{2})(\d{3})(\d{3})">
+ <leadingDigits>8[047]|90</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2-9]\d{8}</nationalNumberPattern>
@@ -1339,7 +1491,9 @@
<availableFormats>
<!-- Using format from online yellow pages over format implied in
national numbering plan. -->
- <numberFormat pattern="(\d{2})(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{2})(\d{2})(\d{2})">
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[02-5]\d{7}</nationalNumberPattern>
@@ -1375,19 +1529,37 @@
with a carrier if they are not local so we strip these carrier codes as
well. -->
<availableFormats>
- <numberFormat leadingDigits="2" pattern="(2)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[357]|4[1-35]|6[13-57]"
- pattern="(\d{2})(\d{2,3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="9" pattern="(9)([6-9]\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="44" pattern="(44)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="60" nationalPrefixFormattingRule="$FG"
- pattern="(600)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="60" nationalPrefixFormattingRule="$FG"
- pattern="(600)(\d{3})(\d{2})(\d{3})">$1 $2 $3 $4</numberFormat>
- <numberFormat leadingDigits="8" nationalPrefixFormattingRule="$FG"
- pattern="(800)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="1" nationalPrefixFormattingRule="$FG"
- pattern="(1230)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(2)(\d{3})(\d{4})">
+ <leadingDigits>2</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{2,3})(\d{4})">
+ <leadingDigits>[357]|4[1-35]|6[13-57]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(9)([6-9]\d{3})(\d{4})">
+ <leadingDigits>9</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(44)(\d{3})(\d{4})">
+ <leadingDigits>44</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$FG"
+ pattern="([68]00)(\d{3})(\d{3,4})">
+ <leadingDigits>60|8</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$FG"
+ pattern="(600)(\d{3})(\d{2})(\d{3})">
+ <leadingDigits>60</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$FG"
+ pattern="(1230)(\d{3})(\d{4})">
+ <leadingDigits>1</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>(?:[2-9]|600|123)\d{7,8}</nationalNumberPattern>
@@ -1433,10 +1605,14 @@
extracted, and usually in the same format as France (all 2 digit groups)
so we use this instead of the guidance of the national numbering plan
(which has 1 3 2 2 and 4 4 as its two formatting examples.)-->
- <numberFormat leadingDigits="[2379]|88"
- pattern="([237-9]\d)(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
- <numberFormat leadingDigits="80"
- pattern="(800)(\d{2})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([237-9]\d)(\d{2})(\d{2})(\d{2})">
+ <leadingDigits>[2379]|88</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
+ <numberFormat pattern="(800)(\d{2})(\d{3})">
+ <leadingDigits>80</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[237-9]\d{7}</nationalNumberPattern>
@@ -1473,21 +1649,43 @@
<territory id="CN" countryCode="86" internationalPrefix="00"
nationalPrefix="0">
<availableFormats>
- <numberFormat leadingDigits="21" nationalPrefixFormattingRule="$NP$FG"
- pattern="(21)(\d{4})(\d{4,6})">$1 $2 $3</numberFormat>
- <!-- The leadingDigits here don't exlude 10800 numbers, as doing so would require more than
- 4 digits for leadingDigits. -->
- <numberFormat leadingDigits="10[1-9]|2[02-9]"
- nationalPrefixFormattingRule="$NP$FG"
- pattern="([12]\d)(\d{4})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="80" nationalPrefixFormattingRule="$NP$FG"
- pattern="(80\d{2})(\d{4})">$1 $2</numberFormat>
- <numberFormat leadingDigits="[35-79]|[48][1-9]" nationalPrefixFormattingRule="$NP$FG"
- pattern="(\d{3})(\d{3,4})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="1[3-58]"
- pattern="(1[3-58]\d)(\d{4})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="40" pattern="(400)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="1080" pattern="(10800)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$NP$FG"
+ pattern="(21)(\d{4})(\d{4,6})">
+ <leadingDigits>21</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$NP$FG"
+ pattern="([12]\d)(\d{4})(\d{4})">
+ <leadingDigits>10[1-9]|2[02-9]</leadingDigits>
+ <!-- Note the leadingDigitsPattern for 4 digits is the same as 3 digits, -->
+ <leadingDigits>10[1-9]|2[02-9]</leadingDigits>
+ <leadingDigits>10(?:[1-79]|8(?:[1-9]|0[1-9]))|2[02-9]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$NP$FG"
+ pattern="(80\d{2})(\d{4})">
+ <leadingDigits>80</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$NP$FG"
+ pattern="(\d{3})(\d{3,4})(\d{4})">
+ <leadingDigits>[35-79]|[48][1-9]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(1[3-58]\d)(\d{4})(\d{4})">
+ <leadingDigits>1[3-58]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(400)(\d{3})(\d{4})">
+ <leadingDigits>40</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(10800)(\d{3})(\d{4})">
+ <leadingDigits>108</leadingDigits>
+ <leadingDigits>1080</leadingDigits>
+ <leadingDigits>10800</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-79]\d{7,11}|8[0-357-9]\d{6,9}</nationalNumberPattern>
@@ -1532,7 +1730,9 @@
<!-- http://www.itu.int/oth/T0202000030/en -->
<territory id="CR" countryCode="506" internationalPrefix="00">
<availableFormats>
- <numberFormat pattern="([28]\d{3})(\d{4})">$1 $2</numberFormat>
+ <numberFormat pattern="([28]\d{3})(\d{4})">
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[28]\d{7}</nationalNumberPattern>
@@ -1557,7 +1757,9 @@
<!-- http://www.itu.int/oth/T0202000026/en -->
<territory id="CV" countryCode="238" internationalPrefix="0">
<availableFormats>
- <numberFormat pattern="(\d{3})(\d{2})(\d{2})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(\d{3})(\d{2})(\d{2})">
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[259]\d{6}</nationalNumberPattern>
@@ -1581,7 +1783,9 @@
<territory id="CY" countryCode="357" internationalPrefix="00">
<availableFormats>
<!-- Format from http://www.cyprusyellowpages.com/-->
- <numberFormat pattern="([27-9]\d)(\d{6})">$1 $2</numberFormat>
+ <numberFormat pattern="([27-9]\d)(\d{6})">
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[27-9]\d{7}</nationalNumberPattern>
@@ -1616,7 +1820,9 @@
<!-- http://en.wikipedia.org/wiki/%2B420 -->
<territory id="CZ" countryCode="420" internationalPrefix="00">
<availableFormats>
- <numberFormat pattern="([2-9]\d{2})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([2-9]\d{2})(\d{3})(\d{3})">
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2-9]\d{8}</nationalNumberPattern>
@@ -1653,28 +1859,41 @@
<territory id="DE" countryCode="49" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="3[02]|40|[68]9"
- pattern="(\d{2})(\d{4,11})">$1/$2</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{4,11})">
+ <leadingDigits>3[02]|40|[68]9</leadingDigits>
+ <format>$1/$2</format>
+ </numberFormat>
<!-- The order of the rules on 3-5 digits area code matter as fallback is used here. -->
<!-- 3 digit area codes.-->
- <numberFormat leadingDigits="2(?:\d1|0[2389]|1[24]|28|34)|3[3-9][15]|340|906|[4-9][1-9]1"
- pattern="(\d{3})(\d{3,10})">$1/$2</numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3,10})">
+ <leadingDigits>2(?:\d1|0[2389]|1[24]|28|34)|3(?:[3-9][15]|40)|[4-8][1-9]1|9(?:06|[1-9]1)</leadingDigits>
+ <format>$1/$2</format>
+ </numberFormat>
<!-- 4 digit area codes.-->
- <numberFormat leadingDigits="[24-6]|[7-9](?:\d[1-9]|[1-9]\d)"
- pattern="([24-9]\d{3})(\d{2,8})">$1/$2</numberFormat>
- <numberFormat
- leadingDigits="3(?:3(?:0[1-467]|2[127-9]|3[124578]|[46][1246]|7[1257-9]|8[1256]|9[145])|4(?:2[135]|3[1357]|4[13578]|6[1246]|7[1356]|9[1346])|5(?:0[14]|2[1-3589]|3[1357]|4[1246]|6[1-4]|7[1346]|8[13568]|9[1246])|6(?:0[356]|2[1-489]|3[124-6]|4[1347]|6[13]|7[12579]|8[1-356]|9[135])|7(?:2[1-7]|3[1357]|4[145]|6[1-5]|7[1-4])|8(?:21|3[1468]|4[1347]|6[0135-9]|7[1467]|8[136])|9(?:0[12479]|2[1358]|3[1357]|4[134679]|6[1-9]|7[136]|8[147]|9[1468]))"
- pattern="(\d{4})(\d{2,7})">$1/$2</numberFormat>
+ <numberFormat pattern="(\d{4})(\d{2,8})">
+ <leadingDigits>[24-6]|[7-9](?:\d[1-9]|[1-9]\d)|3(?:[3569][02-46-9]|4[2-4679]|7[2-467]|8[2-46-8])</leadingDigits>
+ <leadingDigits>[24-6]|[7-9](?:\d[1-9]|[1-9]\d)|3(?:3(?:0[1-467]|2[127-9]|3[124578]|[46][1246]|7[1257-9]|8[1256]|9[145])|4(?:2[135]|3[1357]|4[13578]|6[1246]|7[1356]|9[1346])|5(?:0[14]|2[1-3589]|3[1357]|4[1246]|6[1-4]|7[1346]|8[13568]|9[1246])|6(?:0[356]|2[1-489]|3[124-6]|4[1347]|6[13]|7[12579]|8[1-356]|9[135])|7(?:2[1-7]|3[1357]|4[145]|6[1-5]|7[1-4])|8(?:21|3[1468]|4[1347]|6[0135-9]|7[1467]|8[136])|9(?:0[12479]|2[1358]|3[1357]|4[134679]|6[1-9]|7[136]|8[147]|9[1468]))</leadingDigits>
+ <format>$1/$2</format>
+ </numberFormat>
<!-- 5 digit area codes.-->
- <numberFormat leadingDigits="3" pattern="(\d{5})(\d{1,6})">$1/$2</numberFormat>
+ <numberFormat pattern="(\d{5})(\d{1,6})">
+ <leadingDigits>3</leadingDigits>
+ <format>$1/$2</format>
+ </numberFormat>
<!-- http://www.t-mobile.de/servicehotlines/0,13401,17660-_,00.html -->
- <numberFormat leadingDigits="1[5-7]" pattern="(1[5-7]\d)(\d{7,8})">$1 $2</numberFormat>
- <numberFormat leadingDigits="180" pattern="(180)(\d)(\d{4,10})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="700" pattern="(700)(\d{4})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="800" pattern="(800)(\d{7,9})">$1 $2</numberFormat>
- <numberFormat leadingDigits="900[135]"
- pattern="(900)(\d)(\d{6})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="9009" pattern="(900)(9)(\d{7})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([18]\d{2})(\d{7,9})">
+ <leadingDigits>1[5-7]|800</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d)(\d{4,10})">
+ <leadingDigits>(?:18|90)0</leadingDigits>
+ <leadingDigits>180|900[1359]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(700)(\d{4})(\d{4})">
+ <leadingDigits>700</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<!-- When deciding whether to assume a leading 49 is a country code or
@@ -1726,7 +1945,9 @@
<!-- The number format here is suggested in the plan and used online,
although the phone numbers of the national numbering authority itself on
the plan do not follow this. -->
- <numberFormat pattern="([2-8]\d)(\d{2})(\d{2})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([2-8]\d)(\d{2})(\d{2})">
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2-8]\d{5}</nationalNumberPattern>
@@ -1750,7 +1971,9 @@
<!-- http://en.itst.dk/telecom-internet-regulation/numbering-issues/numbering-lists -->
<territory id="DK" countryCode="45" internationalPrefix="00">
<availableFormats>
- <numberFormat pattern="([1-9]\d)(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="([1-9]\d)(\d{2})(\d{2})(\d{2})">
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-9]\d{7}</nationalNumberPattern>
@@ -1846,12 +2069,18 @@
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
<!-- Formatting from www.pagesjaunes-dz.com. -->
- <numberFormat leadingDigits="[1-4]"
- pattern="([1-4]\d)(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
- <numberFormat leadingDigits="[5-8]"
- pattern="([5-8]\d{2})(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
- <numberFormat leadingDigits="9"
- pattern="(9\d)(\d{3})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="([1-4]\d)(\d{2})(\d{2})(\d{2})">
+ <leadingDigits>[1-4]</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
+ <numberFormat pattern="([5-8]\d{2})(\d{2})(\d{2})(\d{2})">
+ <leadingDigits>[5-8]</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
+ <numberFormat pattern="(9\d)(\d{3})(\d{2})(\d{2})">
+ <leadingDigits>9</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>(?:[1-4]|[5-9]\d)\d{7}</nationalNumberPattern>
@@ -1872,6 +2101,11 @@
<possibleNumberPattern>\d{9}</possibleNumberPattern>
<exampleNumber>800123456</exampleNumber>
</tollFree>
+ <premiumRate>
+ <nationalNumberPattern>80[3-689]1\d{5}</nationalNumberPattern>
+ <possibleNumberPattern>\d{9}</possibleNumberPattern>
+ <exampleNumber>808123456</exampleNumber>
+ </premiumRate>
<!-- The Algerian plan doesn't specify where the costs start to be
considered "premium", so we draw an arbitrary line here and say that from
50 Da up they will be considered premium. -->
@@ -1880,11 +2114,6 @@
<possibleNumberPattern>\d{9}</possibleNumberPattern>
<exampleNumber>801123456</exampleNumber>
</sharedCost>
- <premiumRate>
- <nationalNumberPattern>80[3-689]1\d{5}</nationalNumberPattern>
- <possibleNumberPattern>\d{9}</possibleNumberPattern>
- <exampleNumber>808123456</exampleNumber>
- </premiumRate>
<voip>
<nationalNumberPattern>98[23]\d{6}</nationalNumberPattern>
<possibleNumberPattern>\d{9}</possibleNumberPattern>
@@ -1901,13 +2130,21 @@
<!-- http://www.tja.ee/public/Legislation_side/Numbering_/Estonian_NP_eng.htm -->
<territory id="EE" countryCode="372" internationalPrefix="00">
<availableFormats>
- <numberFormat
- leadingDigits="[34679]|5(?:[02]\d{2}|1(?:[0-8]\d|95)|5[0-478]\d|64[0-4]|65[1-589])"
- pattern="([34-79]\d{2})(\d{4})">$1 $2</numberFormat>
- <numberFormat leadingDigits="8000" pattern="(8000)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="5|8(?:001|[1-5])"
- pattern="([58]\d{3})(\d{4})">$1 $2</numberFormat>
- <numberFormat leadingDigits="800[2-9]" pattern="(800[2-9])(\d{3})">$1 $2</numberFormat>
+ <numberFormat pattern="([34-79]\d{2})(\d{4})">
+ <leadingDigits>[34679]|5(?:[0-2]|5[0-478]|6[45])</leadingDigits>
+ <leadingDigits>[34679]|5(?:[02]|1(?:[0-8]|95)|5[0-478]|6(?:4[0-4]|5[1-589]))</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(8000)(\d{3})(\d{3})">
+ <leadingDigits>800</leadingDigits>
+ <leadingDigits>8000</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([58]\d{3})(\d{3,4})">
+ <leadingDigits>5|8(?:00|[1-5])</leadingDigits>
+ <leadingDigits>5|8(?:00[1-9]|[1-5])</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[3-9]\d{6,7}|800\d{6,7}</nationalNumberPattern>
@@ -1950,12 +2187,18 @@
<!-- Note that no explicit formatting rule is here for 5-digit numbers
starting with a 16 or 19. These are formatted without national prefix,
as a block, so do not need to be listed here. -->
- <numberFormat leadingDigits="2" pattern="(2)(\d{8})">$1 $2</numberFormat>
- <numberFormat leadingDigits="3" pattern="(3)(\d{7})">$1 $2</numberFormat>
- <numberFormat leadingDigits="[14-6]|[89][2-9]"
- pattern="(\d{2})(\d{7})">$1 $2</numberFormat>
- <numberFormat leadingDigits="[89]00"
- pattern="([89]00)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(\d)(\d{7,8})">
+ <leadingDigits>[23]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{7})">
+ <leadingDigits>[14-6]|[89][2-9]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="([89]00)(\d{3})(\d{4})">
+ <leadingDigits>[89]00</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>1\d{4,9}|[2-689]\d{7,9}</nationalNumberPattern>
@@ -1990,7 +2233,9 @@
<territory id="ER" countryCode="291" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat pattern="(\d)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(\d)(\d{3})(\d{3})">
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[178]\d{6}</nationalNumberPattern>
@@ -2013,7 +2258,9 @@
<!-- http://www.mityc.es/telecomunicaciones/es-ES/Servicios/Numeracion/PlanNacional/Paginas/PlanNacionalNumeracion.aspx -->
<territory id="ES" countryCode="34" internationalPrefix="00">
<availableFormats>
- <numberFormat pattern="([5-9]\d{2})(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="([5-9]\d{2})(\d{2})(\d{2})(\d{2})">
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[5-9]\d{8}</nationalNumberPattern>
@@ -2050,7 +2297,9 @@
<territory id="ET" countryCode="251" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat pattern="([1-59]\d)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([1-59]\d)(\d{3})(\d{4})">
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-59]\d{8}</nationalNumberPattern>
@@ -2074,11 +2323,18 @@
<territory id="FI" countryCode="358" internationalPrefix="00|99[049]"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="2[09]|[14]|50|7[135]"
- pattern="(\d{2})(\d{4,10})">$1 $2</numberFormat>
- <numberFormat leadingDigits="[25689][1-8]|3"
- pattern="(\d)(\d{4,11})">$1 $2</numberFormat>
- <numberFormat leadingDigits="[6-8]0" pattern="([6-8]00)(\d{4,7})">$1 $2</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{4,10})">
+ <leadingDigits>2[09]|[14]|50|7[135]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(\d)(\d{4,11})">
+ <leadingDigits>[25689][1-8]|3</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="([6-8]00)(\d{4,7})">
+ <leadingDigits>[6-8]0</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-9]\d{4,11}</nationalNumberPattern>
@@ -2131,10 +2387,15 @@
<territory id="FR" countryCode="33" internationalPrefix="[04579]0"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="[1-79]"
- pattern="([1-79])(\d{2})(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4 $5</numberFormat>
- <numberFormat leadingDigits="8" nationalPrefixFormattingRule="$NP $FG"
- pattern="(8\d{2})(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="([1-79])(\d{2})(\d{2})(\d{2})(\d{2})">
+ <leadingDigits>[1-79]</leadingDigits>
+ <format>$1 $2 $3 $4 $5</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$NP $FG"
+ pattern="(8\d{2})(\d{2})(\d{2})(\d{2})">
+ <leadingDigits>8</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-9]\d{8}</nationalNumberPattern>
@@ -2166,8 +2427,14 @@
<!-- http://www.itu.int/oth/T020200004E/en -->
<territory id="GA" countryCode="241" internationalPrefix="00">
<availableFormats>
- <numberFormat leadingDigits="[4-9]" pattern="(\d{2})(\d{2})(\d{2})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="0" pattern="(0\d)(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{2})(\d{2})">
+ <leadingDigits>[4-9]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(0\d)(\d{2})(\d{2})(\d{2})">
+ <leadingDigits>0</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[4-9]\d{5}|0\d{7}</nationalNumberPattern>
@@ -2202,29 +2469,47 @@
nationalPrefix="0" preferredExtnPrefix=" x" nationalPrefixFormattingRule="$NP$FG"
mainCountryForCode="true" >
<availableFormats>
- <numberFormat leadingDigits="[23]|55"
- pattern="([235]\d)(\d{4})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="1(?:1\d|\d1)"
- pattern="(\d{3})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{4})(\d{4})">
+ <leadingDigits>[23]|5[56]|9[018]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{3,4})">
+ <leadingDigits>1(?:1|\d1)|500</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
<!-- 5-digit area codes (excluding national prefix) are very rare in GB, and are only
available in the following areas: 13873(Langholm), 15242(Hornby), 15394(Hawkshead),
15395(Grange-Over-Sands), 15396(Sedbergh), 16973(Wigton), 16974(Raughton Head),
16977(Brampton), 17683(Appleby), 17684(Pooley Bridge), 17687(Keswick), 19467(Gosforth)-->
- <numberFormat leadingDigits="1(?:3873|5(?:242|39[4-6])|697[347]|768[347]|9467)"
- pattern="(\d{5})(\d{4,5})">$1 $2</numberFormat>
- <numberFormat leadingDigits="1" pattern="(\d{4})(\d{4,6})">$1 $2</numberFormat>
+ <numberFormat pattern="(\d{5})(\d{4,5})">
+ <leadingDigits>1(?:38|5[23]|69|76|94)</leadingDigits>
+ <leadingDigits>1(?:387|5(?:24|39)|697|768|946)</leadingDigits>
+ <leadingDigits>1(?:3873|5(?:242|39[4-6])|697[347]|768[347]|9467)</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(1\d{3})(\d{4,6})">
+ <leadingDigits>1</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
<!-- http://online.vodafone.co.uk/dispatch/Portal/appmanager/vodafone/wrp?_nfpb=true&_pageLabel=Page_BOS_ContactUsContent&pageID=PCU_0001 -->
- <numberFormat leadingDigits="7[1-9]"
- pattern="(7\d{3})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="500" pattern="(500)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="56|9[018]"
- pattern="([59]\d)(\d{4})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="70" pattern="(70\d{2})(\d{6})">$1 $2</numberFormat>
+ <numberFormat pattern="(7\d{3})(\d{3})(\d{3})">
+ <leadingDigits>7[1-9]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(70\d{2})(\d{6})">
+ <leadingDigits>70</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
<!-- UK child line -->
- <numberFormat leadingDigits="8001" pattern="(800)(1111)">$1 $2</numberFormat>
- <numberFormat leadingDigits="80" pattern="(80\d)(\d{3})(\d{3,4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="8(?:4[3-5]|7[01])"
- pattern="(8\d{2})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(800)(1111)">
+ <leadingDigits>800</leadingDigits>
+ <leadingDigits>8001</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(8\d{2})(\d{3})(\d{3,4})">
+ <leadingDigits>8(?:0|4[3-5]|7[01])</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>\d{7,10}</nationalNumberPattern>
@@ -2314,15 +2599,26 @@
<!-- Format isn't very strictly defined - the yellow pages omits area
code and does 2 2 2, the chairman on the communications commission
listed his as 2 2 4 (Tblisi area code).-->
- <numberFormat leadingDigits="32"
- pattern="(32)(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
- <numberFormat leadingDigits="2|3[13-79]|446" pattern="(\d{3})(\d{5})">$1 $2</numberFormat>
- <numberFormat leadingDigits="44(?:2[2369]|[345])"
- pattern="(\d{4})(\d{4})">$1 $2</numberFormat>
- <numberFormat leadingDigits="442[57]" pattern="(442[57])(\d{3})">$1 $2</numberFormat>
- <numberFormat leadingDigits="[5679]" pattern="(\d{2})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="8"
- pattern="(800)(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="(32)(\d{2})(\d{2})(\d{2})">
+ <leadingDigits>32</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{5})">
+ <leadingDigits>2|3[13-79]|446</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{4})(\d{3,4})">
+ <leadingDigits>44[2-5]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{3})(\d{3})">
+ <leadingDigits>[5679]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(800)(\d{2})(\d{2})(\d{2})">
+ <leadingDigits>8</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-3579]\d{7}|8\d{8}</nationalNumberPattern>
@@ -2403,16 +2699,20 @@
<!-- http://www.itu.int/dms_pub/itu-t/oth/02/02/T02020000520001MSWE.doc -->
<!-- http://www.nca.org.gh/index.php?option=com_content&view=article&id=90&Itemid=65 -->
<territory id="GH" countryCode="233" internationalPrefix="00"
- nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
+ nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="[27][12]|4[12]|[35689]1"
- pattern="(\d{2})(\d{3,6})">$1 $2</numberFormat>
- <numberFormat leadingDigits="25|31|[4-9]"
- pattern="([2-9]\d{2})(\d{3,5})">$1 $2</numberFormat>
- <numberFormat leadingDigits="3[02-9]" pattern="(3\d)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="2[47]" pattern="(2[47])(\d{3})(\d{3,4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="2[0368]|54"
- pattern="([25]\d)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{3,6})">
+ <leadingDigits>[27][12]|4[12]|[35689]1</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="([2-9]\d{2})(\d{3,5})">
+ <leadingDigits>25|31|[4-9]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{3})(\d{3,4})">
+ <leadingDigits>2[0346-8]|3[02-9]|54</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2-9]\d{4,8}</nationalNumberPattern>
@@ -2445,7 +2745,9 @@
<!-- http://www.itu.int/oth/T020200004F/en -->
<territory id="GM" countryCode="220" internationalPrefix="00">
<availableFormats>
- <numberFormat pattern="(\d{3})(\d{4})">$1 $2</numberFormat>
+ <numberFormat pattern="(\d{3})(\d{4})">
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[3-9]\d{6}</nationalNumberPattern>
@@ -2465,7 +2767,9 @@
<!-- http://www.itu.int/oth/T020200005B/en -->
<territory id="GN" countryCode="224" internationalPrefix="00">
<availableFormats>
- <numberFormat pattern="(\d{2})(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{2})(\d{2})(\d{2})">
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[367]\d{7}</nationalNumberPattern>
@@ -2490,7 +2794,9 @@
mainCountryForCode="true" nationalPrefix="0"
nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat pattern="([56]90)(\d{2})(\d{4})">$1 $2-$3</numberFormat>
+ <numberFormat pattern="([56]90)(\d{2})(\d{4})">
+ <format>$1 $2-$3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[56]\d{8}</nationalNumberPattern>
@@ -2512,8 +2818,14 @@
<!-- http://www.itu.int/oth/T0202000041/en -->
<territory id="GQ" countryCode="240" internationalPrefix="00">
<availableFormats>
- <numberFormat leadingDigits="[235]" pattern="(\d{2})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[899]" pattern="(\d{3})(\d{6})">$1 $2</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{3})(\d{4})">
+ <leadingDigits>[235]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{6})">
+ <leadingDigits>[89]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[23589]\d{8}</nationalNumberPattern>
@@ -2547,12 +2859,18 @@
<!-- http://en.wikipedia.org/wiki/%2B30 -->
<territory id="GR" countryCode="30" internationalPrefix="00">
<availableFormats>
- <numberFormat leadingDigits="21|7"
- pattern="([27]\d)(\d{4})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="2[2-9]1|[689]"
- pattern="(\d{3})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="2[2-9][02-9]"
- pattern="(2\d{3})(\d{6})">$1 $2</numberFormat>
+ <numberFormat pattern="([27]\d)(\d{4})(\d{4})">
+ <leadingDigits>21|7</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>2[2-9]1|[689]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(2\d{3})(\d{6})">
+ <leadingDigits>2[2-9][02-9]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[26-9]\d{9}</nationalNumberPattern>
@@ -2624,7 +2942,9 @@
<!-- http://www.itu.int/oth/T020200005C/en -->
<territory id="GW" countryCode="245" internationalPrefix="00">
<availableFormats>
- <numberFormat pattern="(\d{3})(\d{4})">$1 $2</numberFormat>
+ <numberFormat pattern="(\d{3})(\d{4})">
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[3567]\d{6}</nationalNumberPattern>
@@ -2649,14 +2969,23 @@
<!-- http://www.ofta.gov.hk/numbering/main.html -->
<territory id="HK" countryCode="852" internationalPrefix="00">
<availableFormats>
- <numberFormat leadingDigits="[235-7]|[89](?:0[1-9]|[1-9])"
- pattern="(\d{4})(\d{4})">$1 $2</numberFormat>
- <numberFormat leadingDigits="800" pattern="(800)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="900"
- pattern="(900)(\d{2})(\d{3})(\d{3})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="(\d{4})(\d{4})">
+ <leadingDigits>[235-7]|[89](?:0[1-9]|[1-9])</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(800)(\d{3})(\d{3})">
+ <leadingDigits>800</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(900)(\d{2})(\d{3})(\d{3})">
+ <leadingDigits>900</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
- <nationalNumberPattern>[235-9]\d{7,11}</nationalNumberPattern>
+ <!-- Slightly more complex pattern to allow the country code to be
+ stripped off if necessary. -->
+ <nationalNumberPattern>[235-7]\d{7}|8\d{7,8}|9\d{7,10}</nationalNumberPattern>
<possibleNumberPattern>\d{8,11}</possibleNumberPattern>
</generalDesc>
<fixedLine>
@@ -2699,18 +3028,42 @@
<!-- The plan says 1 XXX XXXX but the government and local telecom
websites are formatted 1 XXXX XXX, so we prefer that formatting
here. These same sources prefer XXX XXX to XX XXXX as well. -->
- <numberFormat leadingDigits="1" pattern="(1)(\d{4})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="6[029]" pattern="(6[029])(\d{4})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[2-5]"
- pattern="([2-5]\d)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="9"
- pattern="(9[12589])(\d{3,4})(\d{3,4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="9"
- pattern="(9[12589])(\d{3,4})(\d{3})(\d{3})">$1 $2 $3 $4</numberFormat>
- <numberFormat leadingDigits="6[145]|7" pattern="(\d{2})(\d{2})(\d{2,3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="6[145]|7" pattern="(\d{2})(\d{3,4})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="8" pattern="(80[01])(\d{2})(\d{2,3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="8" pattern="(80[01])(\d{3,4})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(1)(\d{4})(\d{3})">
+ <leadingDigits>1</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(6[029])(\d{4})(\d{3})">
+ <leadingDigits>6[029]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([2-5]\d)(\d{3})(\d{3})">
+ <leadingDigits>[2-5]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(9[12589])(\d{3,4})(\d{3,4})">
+ <leadingDigits>9</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(9[12589])(\d{3,4})(\d{3})(\d{3})">
+ <leadingDigits>9</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{2})(\d{2,3})">
+ <leadingDigits>6[145]|7</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{3,4})(\d{3})">
+ <leadingDigits>6[145]|7</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(80[01])(\d{2})(\d{2,3})">
+ <leadingDigits>8</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(80[01])(\d{3,4})(\d{3})">
+ <leadingDigits>8</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-7]\d{5,8}|[89]\d{6,11}</nationalNumberPattern>
@@ -2760,11 +3113,14 @@
format (confirmed by the following the yellow pages) is
to omit this when formatting. Yellow pages: www.aranyoldalak.hu -->
<availableFormats>
- <numberFormat leadingDigits="1" pattern="(1)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[4-689]|[237][2-9]"
- pattern="(\d{2})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[237][01]"
- pattern="([237][01])(\d{3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(1)(\d{3})(\d{4})">
+ <leadingDigits>1</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{3})(\d{3,4})">
+ <leadingDigits>[2-9]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>\d{8,9}</nationalNumberPattern>
@@ -2803,20 +3159,35 @@
<territory id="ID" countryCode="62" internationalPrefix="0(?:0[1789]|10(?:00|1[67]))"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="2[124]|[36]1" nationalPrefixFormattingRule="($NP$FG)"
- pattern="(\d{2})(\d{7,8})">$1 $2</numberFormat>
- <numberFormat leadingDigits="[4579]|2[035-9]|[36][02-9]"
- nationalPrefixFormattingRule="($NP$FG)"
- pattern="(\d{3})(\d{5,7})">$1 $2</numberFormat>
- <numberFormat leadingDigits="8[1-35-9]"
- pattern="(8\d{2})(\d{3,4})(\d{3,4})">$1-$2-$3</numberFormat>
- <numberFormat leadingDigits="1" pattern="(177)(\d{6,8})">$1 $2</numberFormat>
+ <numberFormat nationalPrefixFormattingRule="($NP$FG)"
+ pattern="(\d{2})(\d{7,8})">
+ <leadingDigits>2[124]|[36]1</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="($NP$FG)"
+ pattern="(\d{3})(\d{5,7})">
+ <leadingDigits>[4579]|2[035-9]|[36][02-9]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(8\d{2})(\d{3,4})(\d{3,4})">
+ <leadingDigits>8[1-35-9]</leadingDigits>
+ <format>$1-$2-$3</format>
+ </numberFormat>
+ <numberFormat pattern="(177)(\d{6,8})">
+ <leadingDigits>1</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
<!-- http://en.wikipedia.org/wiki/Toll-free_telephone_number, and
examples on the web show that sometimes they are followed by less
digits. -->
- <numberFormat leadingDigits="800" pattern="(800)(\d{5,7})">$1 $2</numberFormat>
- <numberFormat leadingDigits="809"
- pattern="(809)(\d)(\d{3})(\d{3})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="(800)(\d{5,7})">
+ <leadingDigits>800</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(809)(\d)(\d{3})(\d{3})">
+ <leadingDigits>809</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-9]\d{6,10}</nationalNumberPattern>
@@ -2855,22 +3226,45 @@
<territory id="IE" countryCode="353" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="($NP$FG)">
<availableFormats>
- <numberFormat leadingDigits="1" pattern="(1)(\d{3,4})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="2[2-9]|4[347]|5[2-58]|6[2-47-9]|9[3-9]"
- pattern="(\d{2})(\d{5})">$1 $2</numberFormat>
- <numberFormat leadingDigits="40[24]|50[45]" pattern="(\d{3})(\d{5})">$1 $2</numberFormat>
- <numberFormat leadingDigits="48" pattern="(48)(\d{4})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="81" pattern="(818)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[24-69]|7[14]"
- pattern="(\d{2})(\d{3})(\d{3,4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="8[35-9]" nationalPrefixFormattingRule="$NP$FG"
- pattern="(8[35-9])(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="76" nationalPrefixFormattingRule="$NP$FG"
- pattern="(76)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="70" nationalPrefixFormattingRule="$NP$FG"
- pattern="(700)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="1(?:8[059]0|5)" nationalPrefixFormattingRule="$FG"
- pattern="(\d{4})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(1)(\d{3,4})(\d{4})">
+ <leadingDigits>1</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{5})">
+ <leadingDigits>2[2-9]|4[347]|5[2-58]|6[2-47-9]|9[3-9]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{5})">
+ <leadingDigits>40[24]|50[45]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(48)(\d{4})(\d{4})">
+ <leadingDigits>48</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(818)(\d{3})(\d{3})">
+ <leadingDigits>81</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{3})(\d{3,4})">
+ <leadingDigits>[24-69]|7[14]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$NP$FG"
+ pattern="([78]\d)(\d{3})(\d{4})">
+ <leadingDigits>76|8[35-9]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$NP$FG"
+ pattern="(700)(\d{3})(\d{3})">
+ <leadingDigits>70</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$FG" pattern="(\d{4})(\d{3})(\d{3})">
+ <leadingDigits>1(?:8[059]|5)</leadingDigits>
+ <leadingDigits>1(?:8[059]0|5)</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[124-9]\d{6,9}</nationalNumberPattern>
@@ -2935,16 +3329,33 @@
<territory id="IL" countryCode="972" internationalPrefix="0(?:0|1[2-48])"
nationalPrefix="0" nationalPrefixFormattingRule="$FG">
<availableFormats>
- <numberFormat leadingDigits="[2-489]" nationalPrefixFormattingRule="$NP$FG"
- pattern="([2-489])(\d{3})(\d{4})">$1-$2-$3</numberFormat>
- <numberFormat leadingDigits="[57]" nationalPrefixFormattingRule="$NP$FG"
- pattern="([57]\d)(\d{3})(\d{4})">$1-$2-$3</numberFormat>
- <numberFormat leadingDigits="1[7-9]"
- pattern="(1)([7-9]\d{2})(\d{3})(\d{3})">$1-$2-$3-$4</numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$NP$FG"
+ pattern="([2-489])(\d{3})(\d{4})">
+ <leadingDigits>[2-489]</leadingDigits>
+ <format>$1-$2-$3</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$NP$FG"
+ pattern="([57]\d)(\d{3})(\d{4})">
+ <leadingDigits>[57]</leadingDigits>
+ <format>$1-$2-$3</format>
+ </numberFormat>
+ <numberFormat pattern="(1)([7-9]\d{2})(\d{3})(\d{3})">
+ <leadingDigits>1[7-9]</leadingDigits>
+ <format>$1-$2-$3-$4</format>
+ </numberFormat>
<!-- The following number is for hospitals.-->
- <numberFormat leadingDigits="125" pattern="(1255)(\d{3})">$1-$2</numberFormat>
- <numberFormat leadingDigits="120" pattern="(1200)(\d{3})(\d{3})">$1-$2-$3</numberFormat>
- <numberFormat leadingDigits="121" pattern="(1212)(\d{2})(\d{2})">$1-$2-$3</numberFormat>
+ <numberFormat pattern="(1255)(\d{3})">
+ <leadingDigits>125</leadingDigits>
+ <format>$1-$2</format>
+ </numberFormat>
+ <numberFormat pattern="(1200)(\d{3})(\d{3})">
+ <leadingDigits>120</leadingDigits>
+ <format>$1-$2-$3</format>
+ </numberFormat>
+ <numberFormat pattern="(1212)(\d{2})(\d{2})">
+ <leadingDigits>121</leadingDigits>
+ <format>$1-$2-$3</format>
+ </numberFormat>
</availableFormats>
<generalDesc >
<nationalNumberPattern>[1-57-9]\d{6,9}</nationalNumberPattern>
@@ -3045,39 +3456,68 @@
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
<!-- Mobile numbers. -->
- <numberFormat
- leadingDigits="7(?:39|5(?:50|[6-9])|[67][02-9]|8[0-6])|8(?:0[01589]|1[024]|8(?:[079]|44)|9[057-9])|9"
- pattern="(\d{2})(\d{2})(\d{6})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{2})(\d{6})">
+ <leadingDigits>7(?:39|5[5-9]|[67][02-9]|8[0-6])|8(?:0[01589]|1[024]|8[0479]|9[057-9])|9</leadingDigits>
+ <leadingDigits>7(?:39|5(?:50|[6-9])|[67][02-9]|8[0-6])|8(?:0[01589]|1[024]|8(?:[079]|44)|9[057-9])|9</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
<!-- 2 digits area code -->
- <numberFormat leadingDigits="11|2[02]|33|4[04]|79|80[2-6]"
- pattern="(\d{2})(\d{4})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{4})(\d{4})">
+ <leadingDigits>11|2[02]|33|4[04]|79|80[2-6]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
<!-- 3 digits area code -->
- <numberFormat
- leadingDigits="1(?:2[0-249]|3[0-25]|4[145]|5[14]|6[14]|7[1257]|8[1346]|9[14]|[68][1-9])"
- pattern="(\d{3})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="2(?:1[257]|3[013]|4[01]|5[0137]|6[0158]|78|8[1568]|9[14])"
- pattern="(\d{3})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="3(?:26|4[1-3]|5[34]|6[01489]|7[02-46]|8[159])"
- pattern="(\d{3})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat
- leadingDigits="4(?:1[36]|2[1-47]|3[15]|5[12]|6[126-9]|7[0-24-9]|8[013-57]|9[014-7])"
- pattern="(\d{3})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="5(?:1[25]|22|3[25]|4[28]|5[12]|6[25]|[78]1|9[15])"
- pattern="(\d{3})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="6(?:12|[2345]1|57|6[13]|7[14]|80)"
- pattern="(\d{3})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="7(?:12|2[14]|3[134]|4[47]|5(?:1|5[1-9])|[67]1|88)"
- pattern="(\d{3})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="8(?:16|2[014]|3[126]|6[136]|7[078]|8[34]|91)"
- pattern="(\d{3})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>1(?:2[0-249]|3[0-25]|4[145]|[569][14]|7[1257]|8[1346]|[68][1-9])</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>2(?:1[257]|3[013]|4[01]|5[0137]|6[0158]|78|8[1568]|9[14])</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>3(?:26|4[1-3]|5[34]|6[01489]|7[02-46]|8[159])</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>4(?:1[36]|2[1-47]|3[15]|5[12]|6[126-9]|7[0-24-9]|8[013-57]|9[014-7])</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>5(?:[136][25]|22|4[28]|5[12]|[78]1|9[15])</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>6(?:12|[2345]1|57|6[13]|7[14]|80)</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>7(?:12|2[14]|3[134]|4[47]|5[15]|[67]1|88)</leadingDigits>
+ <leadingDigits>7(?:12|2[14]|3[134]|4[47]|5(?:1|5[1-9])|[67]1|88)</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>8(?:16|2[014]|3[126]|6[136]|7[078]|8[34]|91)</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
<!-- 4 digits area code -->
<!-- Fallback for fixed-line numbers. -->
- <numberFormat leadingDigits="1(?:[2-579]|[68][1-9])|[2-8]"
- pattern="(\d{4})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="1600" nationalPrefixFormattingRule="$FG"
- pattern="(1600)(\d{2})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="1800" nationalPrefixFormattingRule="$FG"
- pattern="(1800)(\d{2,3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(\d{4})(\d{3})(\d{3})">
+ <leadingDigits>1(?:[2-579]|[68][1-9])|[2-8]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$FG"
+ pattern="(1600)(\d{2})(\d{4})">
+ <leadingDigits>160</leadingDigits>
+ <leadingDigits>1600</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$FG"
+ pattern="(1800)(\d{2,3})(\d{4})">
+ <leadingDigits>180</leadingDigits>
+ <leadingDigits>1800</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-9]\d{9,10}</nationalNumberPattern>
@@ -3135,11 +3575,18 @@
<territory id="IQ" countryCode="964" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="1" pattern="(1)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[2-6]"
- pattern="([2-6]\d)(\d{3})(\d{3,4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="7"
- pattern="(7[5-9]\d)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(1)(\d{3})(\d{4})">
+ <leadingDigits>1</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([2-6]\d)(\d{3})(\d{3,4})">
+ <leadingDigits>[2-6]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(7[5-9]\d)(\d{3})(\d{4})">
+ <leadingDigits>7</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-7]\d{7,9}</nationalNumberPattern>
@@ -3164,9 +3611,14 @@
<territory id="IR" countryCode="98" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="21" pattern="(21)(\d{4})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[13-89]|2[02-9]"
- pattern="(\d{3})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(21)(\d{4})(\d{4})">
+ <leadingDigits>21</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>[13-89]|2[02-9]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-9]\d{9}</nationalNumberPattern>
@@ -3195,21 +3647,42 @@
<availableFormats>
<!-- The leading zero for fixed numbers will be prepended before the
matching of these regular expressions.-->
- <numberFormat leadingDigits="0[26]"
- pattern="(0[26])(\d{3,4})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="0[26]" pattern="(0[26])(\d{4})(\d{5})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="0[26]" pattern="(0[26])(\d{6})">$1 $2</numberFormat>
- <numberFormat leadingDigits="0(?:[13-57-9][0159]|36)"
- pattern="(0\d{2})(\d{3,4})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="0(?:[13-57-9][0159]|36)"
- pattern="(0\d{2})(\d{5,6})">$1 $2</numberFormat>
- <numberFormat leadingDigits="0[13-57-9]" pattern="(0\d{3})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="0[13-57-9]" pattern="(0\d{3})(\d{4,6})">$1 $2</numberFormat>
- <numberFormat leadingDigits="[13]|84[78]"
- pattern="(\d{3})(\d{3})(\d{3,4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="800" pattern="(800)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="803" pattern="(803)(\d{3})">$1 $2</numberFormat>
- <numberFormat leadingDigits="89" pattern="(89\d)(\d{3,6})">$1 $2</numberFormat>
+ <numberFormat pattern="(0[26])(\d{3,4})(\d{4})">
+ <leadingDigits>0[26]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(0[26])(\d{4})(\d{5})">
+ <leadingDigits>0[26]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(0[26])(\d{6})">
+ <leadingDigits>0[26]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(0\d{2})(\d{3,4})(\d{4})">
+ <leadingDigits>0(?:[13-57-9][0159]|36)</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(0\d{2})(\d{5,6})">
+ <leadingDigits>0(?:[13-57-9][0159]|36)</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(0\d{3})(\d{3})(\d{4})">
+ <leadingDigits>0[13-57-9]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(0\d{3})(\d{4,6})">
+ <leadingDigits>0[13-57-9]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{3,4})">
+ <leadingDigits>[13]|8(?:00|4[78])</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3,6})">
+ <leadingDigits>8(?:03|9)</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[01389]\d{5,10}</nationalNumberPattern>
@@ -3337,13 +3810,19 @@
<territory id="JO" countryCode="962" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="[2356]"
- pattern="([2356])(\d{3})(\d{4})"
- nationalPrefixFormattingRule="($NP$FG)">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="7[47-9]"
- pattern="(7)(\d{2})(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4 $5</numberFormat>
- <numberFormat leadingDigits="70" pattern="(70\d)(\d{6})">$1 $2</numberFormat>
- <numberFormat leadingDigits="[89]" pattern="([89]\d{2})(\d{5})">$1 $2</numberFormat>
+ <numberFormat nationalPrefixFormattingRule="($NP$FG)"
+ pattern="([2356])(\d{3})(\d{4})">
+ <leadingDigits>[2356]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(7)(\d{2})(\d{2})(\d{2})(\d{2})">
+ <leadingDigits>7[47-9]</leadingDigits>
+ <format>$1 $2 $3 $4 $5</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{5,6})">
+ <leadingDigits>70|[89]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[235-9]\d{7,8}</nationalNumberPattern>
@@ -3389,8 +3868,10 @@
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
<!-- Toll-free numbers -->
- <numberFormat leadingDigits="(?:12|99)0"
- pattern="(\d{3})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{3})">
+ <leadingDigits>(?:12|99)0</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
<!-- Some leading digits are explicitly reserved for a particular purpose.
We handle them first in this rule, and let the following rules ignore those exceptions.
Note: The rule here is not in the files we rely on when creating the other rules.
@@ -3404,8 +3885,10 @@
with Non-3G, Japanese-specific protocol).
See also http://ja.wikipedia.org/wiki/PHS (Japanese)
-->
- <numberFormat leadingDigits="[57-9]0"
- pattern="(\d{2})(\d{4})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{4})(\d{4})">
+ <leadingDigits>[57-9]0</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
<!-- The order of the reg-exps are important.
Examples (not all):
- "15": 15420 -> 154-20, 15472 -> 1547-2, 15410 -> 15-410,
@@ -3415,18 +3898,37 @@
- "99": 99400 -> 99-400, 99430 -> 994-30, 99692 -> 9969-2, 99750 -> 997-50
- "993": 99330 -> 993-30, 99331 -> 99-331, 99332 -> 993-32
-->
- <numberFormat leadingDigits="1(?:267|3(?:7[247]|9[278])|4(?:5[67]|66)|5(?:47|58|64|8[67])|6(?:3[245]|48|5[4-68]))|5(?:769|979[2-69])|499[2468]|7468|8(?:3(?:8[78]|96[2457-9])|636[2-57-9]|477|51[24])|9(?:496|802|91[23]|969)"
- pattern="(\d{4})(\d)(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="1(?:2[3-6]|3[3-9]|4[2-6]|5(?:[236-8]|[45][2-69])|6[2-7]|7[2-689]|8[2-7]|9[1-578])|2(?:2[04-9]|3[3-58]|4[0-468]|6[0135-8]|7[0679]|8[024578]|23[23]|5(?:5[78]|7[2-4]|[0468][2-9])|6(?:17|4[2-5])|78[2-7]|8(?:3[25-9]|9[6-9])|9(?:11|3[2-4]))|4(?:2(?:2[2-9]|8[237-9])|7[059][2-8]|3[689]|6[035-7]|7[68]|80|9[3-5])|5(?:3[1-36-9]|9(?:7[49]|[89][2-8])|4[4578]|5[013-8]|6[1-9]|7[2-8]|8[14-7]|9[4-7])|7(?:2[15]|3[5-9]|4[02-9]|6[135-8]|7[0-4689]|9[017-9]|618|797|9(?:4[6-8]|5[2-478]|6[2-589]))|8(?:29(?:20|4[04-9]|65[25]|[36]60)|376[0-59]|6(?:366|55[014-9]|69[02-69]|99[23])|24[4-8]|29[3578]|3(?:[3-6][2-9]|[78][2-5])|6(?:5[467]|9[236-8]|[68][2-8])|4[5-8]|5[2-9]|6[37]|7[579]|8[03-579]|9[2-8])|9(?:[23]0|4[0246-9]|5[025-79]|6[4-9]|7[27-9]|8[02-7]|[47]3|[57]4|9(?:4[2-69]|3(?:3[02-9]|4[0-24689])|[5-7]))"
- pattern="(\d{3})(\d{2})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="1|2(?:23|5(?:[57]|[68]0|917|999)|64|78|8[39]|917)|4(?:2(?:[68]|20|9[178])|64|7[347])|5(?:[2-589]|39[67])|8(?:[46-9]|3[279]|2(?:[124589]|9[24])|3[79]6|6(?:69|99))|9(?:[235-8]|9331|934)|15[45]"
- pattern="(\d{2})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="2(?:9[14-79]|74|[34]7|[56]9)|82|993"
- pattern="(\d{3})(\d{2})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[36]|4(?:2[09]|7[01])"
- pattern="(\d)(\d{4})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[2479]"
- pattern="(\d{2})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(\d{4})(\d)(\d{4})">
+ <leadingDigits>1(?:26|3[79]|4[56]|5[4-68]|6[3-5])|5(?:76|97)|499|746|8(?:3[89]|63|47|51)|9(?:49|80|9[16])</leadingDigits>
+ <leadingDigits>1(?:267|3(?:7[247]|9[278])|4(?:5[67]|66)|5(?:47|58|64|8[67])|6(?:3[245]|48|5[4-68]))|5(?:76|97)9|499[2468]|7468|8(?:3(?:8[78]|96)|636|477|51[24])|9(?:496|802|9(?:1[23]|69))</leadingDigits>
+ <leadingDigits>1(?:267|3(?:7[247]|9[278])|4(?:5[67]|66)|5(?:47|58|64|8[67])|6(?:3[245]|48|5[4-68]))|5(?:769|979[2-69])|499[2468]|7468|8(?:3(?:8[78]|96[2457-9])|636[2-57-9]|477|51[24])|9(?:496|802|9(?:1[23]|69))</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{2})(\d{4})">
+ <leadingDigits>1(?:2[3-6]|3[3-9]|4[2-6]|5[2-8]|[68][2-7]|7[2-689]|9[1-578])|2(?:2[034-9]|3[3-58]|4[0-468]|5[04-8]|6[013-8]|7[06-9]|8[02-57-9]|9[13])|4(?:2[28]|3[689]|6[035-7]|7[05689]|80|9[3-5])|5(?:3[1-36-9]|4[4578]|5[013-8]|6[1-9]|7[2-8]|8[14-7]|9[4-9])|7(?:2[15]|3[5-9]|4[02-9]|6[135-8]|7[0-4689]|9[014-9])|8(?:2[49]|3[3-8]|4[5-8]|5[2-9]|6[35-9]|7[579]|8[03-579]|9[2-8])|9(?:[23]0|4[02-46-9]|5[0245-79]|6[4-9]|7[2-47-9]|8[02-7]|9[3-7])</leadingDigits>
+ <leadingDigits>1(?:2[3-6]|3[3-9]|4[2-6]|5(?:[236-8]|[45][2-69])|[68][2-7]|7[2-689]|9[1-578])|2(?:2(?:[04-9]|3[23])|3[3-58]|4[0-468]|5(?:5[78]|7[2-4]|[0468][2-9])|6(?:[0135-8]|4[2-5])|7(?:[0679]|8[2-7])|8(?:[024578]|3[25-9]|9[6-9])|9(?:11|3[2-4]))|4(?:2(?:2[2-9]|8[237-9])|3[689]|6[035-7]|7(?:[059][2-8]|[68])|80|9[3-5])|5(?:3[1-36-9]|4[4578]|5[013-8]|6[1-9]|7[2-8]|8[14-7]|9(?:[89][2-8]|[4-7]))|7(?:2[15]|3[5-9]|4[02-9]|6[135-8]|7[0-4689]|9(?:[017-9]|4[6-8]|5[2-478]|6[2-589]))|8(?:2(?:4[4-8]|9[2-8])|3(?:7[2-56]|[3-6][2-9]|8[2-5])|4[5-8]|5[2-9]|6(?:[37]|5[4-7]|6[2-9]|8[2-8]|9[236-9])|7[579]|8[03-579]|9[2-8])|9(?:[23]0|4[02-46-9]|5[0245-79]|6[4-9]|7[2-47-9]|8[02-7]|9(?:3[34]|[4-7]))</leadingDigits>
+ <leadingDigits>1(?:2[3-6]|3[3-9]|4[2-6]|5(?:[236-8]|[45][2-69])|[68][2-7]|7[2-689]|9[1-578])|2(?:2(?:[04-9]|3[23])|3[3-58]|4[0-468]|5(?:5[78]|7[2-4]|[0468][2-9])|6(?:[0135-8]|4[2-5])|7(?:[0679]|8[2-7])|8(?:[024578]|3[25-9]|9[6-9])|9(?:11|3[2-4]))|4(?:2(?:2[2-9]|8[237-9])|3[689]|6[035-7]|7(?:[059][2-8]|[68])|80|9[3-5])|5(?:3[1-36-9]|4[4578]|5[013-8]|6[1-9]|7[2-8]|8[14-7]|9(?:[89][2-8]|[4-7]))|7(?:2[15]|3[5-9]|4[02-9]|6[135-8]|7[0-4689]|9(?:[017-9]|4[6-8]|5[2-478]|6[2-589]))|8(?:2(?:4[4-8]|9(?:[3578]|20|4[04-9]|6[56]))|3(?:7(?:[2-5]|6[0-59])|[3-6][2-9]|8[2-5])|4[5-8]|5[2-9]|6(?:[37]|5(?:[467]|5[014-9])|6(?:[2-8]|9[02-69])|8[2-8]|9(?:[236-8]|9[23]))|7[579]|8[03-579]|9[2-8])|9(?:[23]0|4[02-46-9]|5[0245-79]|6[4-9]|7[2-47-9]|8[02-7]|9(?:3(?:3[02-9]|4[0-24689])|4[2-69]|[5-7]))</leadingDigits>
+ <leadingDigits>1(?:2[3-6]|3[3-9]|4[2-6]|5(?:[236-8]|[45][2-69])|[68][2-7]|7[2-689]|9[1-578])|2(?:2(?:[04-9]|3[23])|3[3-58]|4[0-468]|5(?:5[78]|7[2-4]|[0468][2-9])|6(?:[0135-8]|4[2-5])|7(?:[0679]|8[2-7])|8(?:[024578]|3[25-9]|9[6-9])|9(?:11|3[2-4]))|4(?:2(?:2[2-9]|8[237-9])|3[689]|6[035-7]|7(?:[059][2-8]|[68])|80|9[3-5])|5(?:3[1-36-9]|4[4578]|5[013-8]|6[1-9]|7[2-8]|8[14-7]|9(?:[89][2-8]|[4-7]))|7(?:2[15]|3[5-9]|4[02-9]|6[135-8]|7[0-4689]|9(?:[017-9]|4[6-8]|5[2-478]|6[2-589]))|8(?:2(?:4[4-8]|9(?:[3578]|20|4[04-9]|6(?:5[25]|60)))|3(?:7(?:[2-5]|6[0-59])|[3-6][2-9]|8[2-5])|4[5-8]|5[2-9]|6(?:[37]|5(?:[467]|5[014-9])|6(?:[2-8]|9[02-69])|8[2-8]|9(?:[236-8]|9[23]))|7[579]|8[03-579]|9[2-8])|9(?:[23]0|4[02-46-9]|5[0245-79]|6[4-9]|7[2-47-9]|8[02-7]|9(?:3(?:3[02-9]|4[0-24689])|4[2-69]|[5-7]))</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{3})(\d{4})">
+ <leadingDigits>1|2(?:23|5[5-89]|64|78|8[39]|91)|4(?:2[2689]|64|7[347])|5(?:[2-589]|39)|8(?:[46-9]|3[279]|2[124589])|9(?:[235-8]|93)</leadingDigits>
+ <leadingDigits>1|2(?:23|5(?:[57]|[68]0|9[19])|64|78|8[39]|917)|4(?:2(?:[68]|20|9[178])|64|7[347])|5(?:[2-589]|39[67])|8(?:[46-9]|3[279]|2[124589])|9(?:[235-8]|93[34])</leadingDigits>
+ <leadingDigits>1|2(?:23|5(?:[57]|[68]0|9(?:17|99))|64|78|8[39]|917)|4(?:2(?:[68]|20|9[178])|64|7[347])|5(?:[2-589]|39[67])|8(?:[46-9]|3[279]|2[124589])|9(?:[235-8]|93(?:31|4))</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{2})(\d{4})">
+ <leadingDigits>2(?:9[14-79]|74|[34]7|[56]9)|82|993</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d)(\d{4})(\d{4})">
+ <leadingDigits>[36]|4(?:2[09]|7[01])</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{3})(\d{4})">
+ <leadingDigits>[2479]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>\d{9,10}</nationalNumberPattern>
@@ -3473,10 +3975,14 @@
<territory id="KE" countryCode="254" internationalPrefix="000"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="[2-6]" pattern="([2-6]\d)(\d{4,7})">$1 $2</numberFormat>
- <numberFormat leadingDigits="7" pattern="(7\d{2})(\d{6})">$1 $2</numberFormat>
- <numberFormat leadingDigits="8|90" pattern="(\d{3})(\d{6,7})">$1 $2</numberFormat>
- <numberFormat leadingDigits="91" pattern="(91)(\d{6,7})">$1 $2</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{4,7})">
+ <leadingDigits>[2-6]|91</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{6,7})">
+ <leadingDigits>[78]|90</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>\d{6,10}</nationalNumberPattern>
@@ -3511,11 +4017,16 @@
<!-- Kyrgyzstan -->
<!-- http://www.itu.int/oth/T0202000074/en -->
<territory id="KG" countryCode="996" internationalPrefix="00"
- nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
+ nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="31[25]|[5-8]"
- pattern="(\d{3})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="3(?:1[36]|[2-9])" pattern="(\d{4})(\d{5})">$1 $2</numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{3})">
+ <leadingDigits>31[25]|[5-8]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{4})(\d{5})">
+ <leadingDigits>3(?:1[36]|[2-9])</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[356-8]\d{8}</nationalNumberPattern>
@@ -3545,10 +4056,15 @@
<territory id="KH" countryCode="855" internationalPrefix="00[178]"
nationalPrefix="0">
<availableFormats>
- <numberFormat leadingDigits="1\d[1-9]|[2-9]" nationalPrefixFormattingRule="$NP$FG"
- pattern="(\d{2})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="1[89]0"
- pattern="(1[89]00)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$NP$FG"
+ pattern="(\d{2})(\d{3})(\d{3})">
+ <leadingDigits>1\d[1-9]|[2-9]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(1[89]00)(\d{3})(\d{3})">
+ <leadingDigits>1[89]0</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-9]\d{7,9}</nationalNumberPattern>
@@ -3587,7 +4103,9 @@
<!-- http://www.itu.int/oth/T020200002D/en -->
<territory id="KM" countryCode="269" internationalPrefix="00">
<availableFormats>
- <numberFormat pattern="(\d)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(\d)(\d{3})(\d{3})">
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[37]\d{6}</nationalNumberPattern>
@@ -3655,30 +4173,53 @@
nationalPrefix="0" nationalPrefixForParsing="0(?:8[1-46-8]|85\d{2})?"
nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="1(?:0|1[19]|[69]9|5(?:44|59|8))|[57]0"
- pattern="(\d{2})(\d{4})(\d{4})">$1-$2-$3</numberFormat>
- <numberFormat leadingDigits="1(?:[169][2-8]|[78]|5(?:[1-3]|4[56]))|[68]0|[3-9][1-9][2-9]"
- pattern="(\d{2})(\d{3})(\d{4})">$1-$2-$3</numberFormat>
- <numberFormat leadingDigits="1312"
- pattern="(\d{3})(\d)(\d{4})">$1-$2-$3</numberFormat>
- <numberFormat leadingDigits="131[13-9]"
- pattern="(\d{3})(\d{2})(\d{4})">$1-$2-$3</numberFormat>
- <numberFormat leadingDigits="13[2-9]"
- pattern="(\d{3})(\d{3})(\d{4})">$1-$2-$3</numberFormat>
- <numberFormat leadingDigits="30"
- pattern="(\d{2})(\d{2})(\d{3})(\d{4})">$1-$2-$3-$4</numberFormat>
- <numberFormat leadingDigits="2(?:[26]|3(?:01|1[45]|2[17-9]|39|4|6[67]|7[078]))"
- pattern="(\d)(\d{4})(\d{4})">$1-$2-$3</numberFormat>
- <numberFormat leadingDigits="2(?:3(?:0[02-9]|1[0-36-9]|2[02-6]|3[0-8]|6[0-589]|7[1-69]|[589])|[457-9])"
- pattern="(\d)(\d{3})(\d{4})">$1-$2-$3</numberFormat>
- <numberFormat leadingDigits="21(?:[0-247-9]|3[124]|6[1269])"
- pattern="(\d)(\d{3})">$1-$2</numberFormat>
- <numberFormat leadingDigits="21(?:3[035-9]|6[03-578])"
- pattern="(\d)(\d{4})">$1-$2</numberFormat>
- <numberFormat leadingDigits="[3-9][1-9]1(?:[0-247-9]|3[124]|6[1269])"
- pattern="(\d{2})(\d{3})">$1-$2</numberFormat>
- <numberFormat leadingDigits="[3-9][1-9]1(?:3[035-9]|6[03-578])"
- pattern="(\d{2})(\d{4})">$1-$2</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{4})(\d{4})">
+ <leadingDigits>1(?:0|1[19]|[69]9|5[458])|[57]0</leadingDigits>
+ <leadingDigits>1(?:0|1[19]|[69]9|5(?:44|59|8))|[57]0</leadingDigits>
+ <format>$1-$2-$3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{3})(\d{4})">
+ <leadingDigits>1(?:[169][2-8]|[78]|5[1-4])|[68]0|[3-9][1-9][2-9]</leadingDigits>
+ <leadingDigits>1(?:[169][2-8]|[78]|5(?:[1-3]|4[56]))|[68]0|[3-9][1-9][2-9]</leadingDigits>
+ <format>$1-$2-$3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d)(\d{4})">
+ <leadingDigits>131</leadingDigits>
+ <leadingDigits>1312</leadingDigits>
+ <format>$1-$2-$3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{2})(\d{4})">
+ <leadingDigits>131</leadingDigits>
+ <leadingDigits>131[13-9]</leadingDigits>
+ <format>$1-$2-$3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>13[2-9]</leadingDigits>
+ <format>$1-$2-$3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{2})(\d{3})(\d{4})">
+ <leadingDigits>30</leadingDigits>
+ <format>$1-$2-$3-$4</format>
+ </numberFormat>
+ <numberFormat pattern="(\d)(\d{4})(\d{4})">
+ <leadingDigits>2(?:[26]|3[0-467])</leadingDigits>
+ <leadingDigits>2(?:[26]|3(?:01|1[45]|2[17-9]|39|4|6[67]|7[078]))</leadingDigits>
+ <format>$1-$2-$3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d)(\d{3})(\d{4})">
+ <leadingDigits>2(?:3[0-35-9]|[457-9])</leadingDigits>
+ <leadingDigits>2(?:3(?:0[02-9]|1[0-36-9]|2[02-6]|3[0-8]|6[0-589]|7[1-69]|[589])|[457-9])</leadingDigits>
+ <format>$1-$2-$3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d)(\d{3,4})">
+ <leadingDigits>21[0-46-9]</leadingDigits>
+ <format>$1-$2</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{3,4})">
+ <leadingDigits>[3-9][1-9]1</leadingDigits>
+ <leadingDigits>[3-9][1-9]1(?:[0-46-9])</leadingDigits>
+ <format>$1-$2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-79]\d{3,9}|8\d{8}</nationalNumberPattern>
@@ -3722,10 +4263,14 @@
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
<!-- Format is from http://www.kuwait.com/index.php?option=com_mtree&task=viewlink&link_id=139&Itemid=15 -->
- <numberFormat leadingDigits="1" pattern="(18\d{2})(\d{3})">$1 $2</numberFormat>
- <numberFormat leadingDigits="2" pattern="(2[2-5]\d{2})(\d{4})">$1 $2</numberFormat>
- <numberFormat leadingDigits="[69]" pattern="([69]\d{3})(\d{4})">$1 $2</numberFormat>
- <numberFormat leadingDigits="5" pattern="(5[05]\d)(\d{5})">$1 $2</numberFormat>
+ <numberFormat pattern="(\d{4})(\d{3,4})">
+ <leadingDigits>[1269]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(5[05]\d)(\d{5})">
+ <leadingDigits>5</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[12569]\d{6,7}</nationalNumberPattern>
@@ -3808,10 +4353,14 @@
<territory id="LA" countryCode="856" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="20"
- pattern="(20)([2357-9])(\d{3})(\d{3})">$1 $2 $3 $4</numberFormat>
- <numberFormat leadingDigits="21|[3-57]"
- pattern="([2-57]\d)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(20)([2357-9])(\d{3})(\d{3})">
+ <leadingDigits>20</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
+ <numberFormat pattern="([2-57]\d)(\d{3})(\d{3})">
+ <leadingDigits>21|[3-57]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2-57]\d{7,8}</nationalNumberPattern>
@@ -3838,12 +4387,18 @@
<territory id="LB" countryCode="961" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="[13-6]"
- pattern="([13-6])(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[7-9][01]"
- pattern="([7-9][01])(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[7-9][2-9]"
- pattern="([7-9][2-9])(\d{2})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([13-6])(\d{3})(\d{3})">
+ <leadingDigits>[13-6]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([7-9][01])(\d{3})(\d{3})">
+ <leadingDigits>[7-9][01]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([7-9][2-9])(\d{2})(\d{3})">
+ <leadingDigits>[7-9][2-9]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[13-9]\d{6,7}</nationalNumberPattern>
@@ -3911,16 +4466,25 @@
shared cost numbers - look at "Mehrwertnummer". -->
<territory id="LI" countryCode="423" internationalPrefix="00">
<availableFormats>
- <numberFormat leadingDigits="[23]|7[4-9]|87"
- pattern="(\d{3})(\d{2})(\d{2})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="6" pattern="(6\d)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[7-9]0"
- pattern="([7-9]0\d)(\d{2})(\d{2})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(\d{3})(\d{2})(\d{2})">
+ <leadingDigits>[23]|7[4-9]|87</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(6\d)(\d{3})(\d{3})">
+ <leadingDigits>6</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([7-9]0\d)(\d{2})(\d{2})">
+ <leadingDigits>[7-9]0</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
<!-- 0800 and 0900 are valid prefixes, but Liechtenstein
doesn't have a general national prefix, so we include it manually here
when formatting. We can tell whether it needs one by number length.-->
- <numberFormat leadingDigits="[89]0"
- pattern="([89]0\d)(\d{2})(\d{2})(\d{2})">0$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="([89]0\d)(\d{2})(\d{2})(\d{2})">
+ <leadingDigits>[89]0</leadingDigits>
+ <format>0$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>(?:66|80|90)\d{7}|[237-9]\d{6}</nationalNumberPattern>
@@ -3966,10 +4530,14 @@
<availableFormats>
<!-- Formatting from Ministry of Agriculture,
http://www.moa.gov.lr/content.php?sub=Email&?related=Contacts -->
- <numberFormat leadingDigits="[27]"
- pattern="([27]\d)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[4-6]"
- pattern="([4-6])(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([27]\d)(\d{3})(\d{3})">
+ <leadingDigits>[27]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([4-6])(\d{3})(\d{3})">
+ <leadingDigits>[4-6]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>(?:[27]\d|[4-6])\d{6}</nationalNumberPattern>
@@ -3993,7 +4561,9 @@
<territory id="LS" countryCode="266" internationalPrefix="00">
<availableFormats>
<!-- Formatting following yellow pages: www.yellowpages.co.ls-->
- <numberFormat pattern="(\d{4})(\d{4})">$1 $2</numberFormat>
+ <numberFormat pattern="(\d{4})(\d{4})">
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2568]\d{7}</nationalNumberPattern>
@@ -4019,13 +4589,19 @@
nationalPrefix="8" nationalPrefixFormattingRule="$NP $FG">
<availableFormats>
<!-- Two-digit area codes -->
- <numberFormat leadingDigits="37|4(?:1|5[45]|6[2-4])"
- pattern="([34]\d)(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="([34]\d)(\d{2})(\d{2})(\d{2})">
+ <leadingDigits>37|4(?:1|5[45]|6[2-4])</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
<!-- Three-digit area codes -->
- <numberFormat leadingDigits="3[148]|4(?:[24]|6[09])|5(?:[0189]|28)|[689]"
- pattern="([3-689]\d{2})(\d{2})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="52[0-79]"
- pattern="(5)(2[0-79]\d)(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([3-689]\d{2})(\d{2})(\d{3})">
+ <leadingDigits>3[148]|4(?:[24]|6[09])|5(?:[0189]|28)|[689]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(5)(2[0-79]\d)(\d{4})">
+ <leadingDigits>52[0-79]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[3-9]\d{7}</nationalNumberPattern>
@@ -4057,7 +4633,9 @@
<!-- http://www.itu.int/oth/T0202000076/en -->
<territory id="LV" countryCode="371" internationalPrefix="00">
<availableFormats>
- <numberFormat pattern="([2689]\d)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([2689]\d)(\d{3})(\d{3})">
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2689]\d{7}</nationalNumberPattern>
@@ -4092,14 +4670,24 @@
<territory id="MA" countryCode="212" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="5(?:2[015-7]|3[0-4])|6"
- pattern="([56]\d{2})(\d{6})">$1-$2</numberFormat>
- <numberFormat leadingDigits="5(?:2(?:[2-48]|90)|3(?:[5-79]|80))|892"
- pattern="([58]\d{3})(\d{5})">$1-$2</numberFormat>
- <numberFormat leadingDigits="5(?:29[89]|38[89])"
- pattern="(5\d{4})(\d{4})">$1-$2</numberFormat>
- <numberFormat leadingDigits="8(?:0|9[013-9])"
- pattern="(8[09])(\d{7})">$1-$2</numberFormat>
+ <numberFormat pattern="([56]\d{2})(\d{6})">
+ <leadingDigits>5(?:2[015-7]|3[0-4])|6</leadingDigits>
+ <format>$1-$2</format>
+ </numberFormat>
+ <numberFormat pattern="([58]\d{3})(\d{5})">
+ <leadingDigits>5(?:2[2-489]|3[5-9])|892</leadingDigits>
+ <leadingDigits>5(?:2(?:[2-48]|90)|3(?:[5-79]|80))|892</leadingDigits>
+ <format>$1-$2</format>
+ </numberFormat>
+ <numberFormat pattern="(5\d{4})(\d{4})">
+ <leadingDigits>5(?:29|38)</leadingDigits>
+ <leadingDigits>5(?:29|38)[89]</leadingDigits>
+ <format>$1-$2</format>
+ </numberFormat>
+ <numberFormat pattern="(8[09])(\d{7})">
+ <leadingDigits>8(?:0|9[013-9])</leadingDigits>
+ <format>$1-$2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[5689]\d{8}</nationalNumberPattern>
@@ -4134,10 +4722,18 @@
<territory id="MD" countryCode="373" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="22" pattern="(22)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="2[13-79]|[5-7]"
- pattern="([25-7]\d{2})(\d{2})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[89]" pattern="([89]00)(\d{5})">$1 $2</numberFormat>
+ <numberFormat pattern="(22)(\d{3})(\d{3})">
+ <leadingDigits>22</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([25-7]\d{2})(\d{2})(\d{3})">
+ <leadingDigits>2[13-79]|[5-7]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([89]00)(\d{5})">
+ <leadingDigits>[89]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[256-9]\d{7}</nationalNumberPattern>
@@ -4174,7 +4770,9 @@
<territory id="MG" countryCode="261" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat pattern="([23]\d)(\d{2})(\d{3})(\d{2})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="([23]\d)(\d{2})(\d{3})(\d{2})">
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[23]\d{8}</nationalNumberPattern>
@@ -4228,11 +4826,18 @@
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
<!-- Formats follow wikipedia. -->
- <numberFormat leadingDigits="2" pattern="(2)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[347]"
- pattern="([347]\d)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[58]"
- pattern="([58]\d{2})(\d)(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="(2)(\d{3})(\d{4})">
+ <leadingDigits>2</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([347]\d)(\d{3})(\d{3})">
+ <leadingDigits>[347]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([58]\d{2})(\d)(\d{2})(\d{2})">
+ <leadingDigits>[58]</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2-578]\d{7}</nationalNumberPattern>
@@ -4267,7 +4872,9 @@
<territory id="ML" countryCode="223" internationalPrefix="00"
nationalPrefix="0">
<availableFormats>
- <numberFormat pattern="([246-8]\d)(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="([246-8]\d)(\d{2})(\d{2})(\d{2})">
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[246-8]\d{7}</nationalNumberPattern>
@@ -4294,18 +4901,33 @@
<!-- http://www.itu.int/oth/T0202000092/en -->
<territory id="MM" countryCode="95" internationalPrefix="00">
<availableFormats>
- <numberFormat leadingDigits="1" pattern="(1)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(1)(\d{3})(\d{3})">
+ <leadingDigits>1</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
<!-- This overlaps the previous pattern. -->
- <numberFormat leadingDigits="13"
- pattern="(1)(3)(33\d)(\d{3})">$1 $2 $3 $4</numberFormat>
- <numberFormat leadingDigits="2"
- pattern="(2)(\d{2})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[4-8]"
- pattern="(\d{2})(\d{2})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(1)(3)(33\d)(\d{3})">
+ <leadingDigits>133</leadingDigits>
+ <leadingDigits>1333</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
+ <numberFormat pattern="(2)(\d{2})(\d{3})">
+ <leadingDigits>2</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{2})(\d{3})">
+ <leadingDigits>[4-8]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
<!-- Format is from http://www.aitaa.ait.ac.th/chapters/copy17_of_aitaa-national-chapters-1 -->
- <numberFormat leadingDigits="94" pattern="(9444)(\d{5})">$1 $2</numberFormat>
- <numberFormat leadingDigits="9[25689]"
- pattern="(9)([25689]\d{2})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(9444)(\d{5})">
+ <leadingDigits>94</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(9)([25689]\d{2})(\d{4})">
+ <leadingDigits>9[25689]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[124-8]\d{5,7}|9\d{7,8}</nationalNumberPattern>
@@ -4330,13 +4952,24 @@
<territory id="MN" countryCode="976" internationalPrefix="001"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="[12]1|[7-9]"
- pattern="([127-9]\d)(\d{2})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[12]2[1-3]" pattern="([12]2\d)(\d{5})">$1 $2</numberFormat>
- <numberFormat leadingDigits="[12](?:27|[3-5]\d)2"
- pattern="([12]\d{3})(\d{4})">$1 $2</numberFormat>
- <numberFormat leadingDigits="[12](?:27|[3-5]\d)[4-9]"
- pattern="([12]\d{4})(\d{3})">$1 $2</numberFormat>
+ <numberFormat pattern="([127-9]\d)(\d{2})(\d{4})">
+ <leadingDigits>[12]1|[7-9]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([12]2\d)(\d{5})">
+ <leadingDigits>[12]2[1-3]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="([12]\d{3})(\d{4})">
+ <leadingDigits>[12](?:27|[3-5])</leadingDigits>
+ <leadingDigits>[12](?:27|[3-5]\d)2</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="([12]\d{4})(\d{3})">
+ <leadingDigits>[12](?:27|[3-5])</leadingDigits>
+ <leadingDigits>[12](?:27|[3-5]\d)[4-9]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[127-9]\d{7}</nationalNumberPattern>
@@ -4360,7 +4993,9 @@
<!-- http://www.itu.int/oth/T020200007E/en -->
<territory id="MO" countryCode="853" internationalPrefix="00">
<availableFormats>
- <numberFormat pattern="([268]\d{3})(\d{4})">$1 $2</numberFormat>
+ <numberFormat pattern="([268]\d{3})(\d{4})">
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[268]\d{7}</nationalNumberPattern>
@@ -4419,7 +5054,9 @@
<!-- http://www.are.mr/com-1-4-1.html -->
<territory id="MR" countryCode="222" internationalPrefix="00" >
<availableFormats>
- <numberFormat pattern="([2-7]\d{2})(\d{2})(\d{2})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([2-7]\d{2})(\d{2})(\d{2})">
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2-7]\d{6}</nationalNumberPattern>
@@ -4478,7 +5115,9 @@
happen August 2010, and 7 digit numbers will be phased out by 1 November
2010. -->
<availableFormats>
- <numberFormat pattern="([2-9]\d{2})(\d{4})">$1 $2</numberFormat>
+ <numberFormat pattern="([2-9]\d{2})(\d{4})">
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2-9]\d{6}</nationalNumberPattern>
@@ -4521,14 +5160,22 @@
<territory id="MW" countryCode="265" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="[13-5]"
- pattern="(\d)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="2"
- pattern="(2\d{2})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="7"
- pattern="(\d)(\d{4})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[89]"
- pattern="(\d)(\d{3,4})(\d{3,4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(\d)(\d{3})(\d{3})">
+ <leadingDigits>[13-5]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(2\d{2})(\d{3})(\d{3})">
+ <leadingDigits>2</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d)(\d{4})(\d{4})">
+ <leadingDigits>7</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d)(\d{3,4})(\d{3,4})">
+ <leadingDigits>[89]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<!-- According to the plan, the switch from 7 to 9 digits for mobile
numbers happened in July 2009. However, online numbers don't
@@ -4564,28 +5211,40 @@
in international format (leading 1) or national format
(leading 045/046), will be parsed into the same form. -->
<availableFormats>
- <numberFormat leadingDigits="33|55|81"
- pattern="([358]\d)(\d{4})(\d{4})">$1 $2 $3</numberFormat>
- <intlNumberFormat leadingDigits="33|55|81"
- pattern="([358]\d)(\d{4})(\d{4})">$1 $2 $3</intlNumberFormat>
- <numberFormat leadingDigits="[2467]|3[12457-9]|5[89]|8[2-9]|9[1-35-9]"
- pattern="(\d{3})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <intlNumberFormat leadingDigits="[2467]|3[12457-9]|5[89]|8[2-9]|9[1-35-9]"
- pattern="(\d{3})(\d{3})(\d{4})">$1 $2 $3</intlNumberFormat>
- <numberFormat leadingDigits="1(?:33|55|81)"
- nationalPrefixFormattingRule="$FG"
- pattern="1([358]\d)(\d{4})(\d{4})">045 $1 $2 $3</numberFormat>
- <intlNumberFormat leadingDigits="1(?:33|55|81)"
- pattern="(1)([358]\d)(\d{4})(\d{4})">$1 $2 $3 $4</intlNumberFormat>
- <numberFormat leadingDigits="1(?:[2467]|3[12457-9]|5[89]|8[2-9]|9[1-35-9])"
- nationalPrefixFormattingRule="$FG"
- pattern="1(\d{3})(\d{3})(\d{4})">045 $1 $2 $3</numberFormat>
- <intlNumberFormat leadingDigits="1(?:[2467]|3[12457-9]|5[89]|8[2-9]|9[1-35-9])"
- pattern="(1)(\d{3})(\d{3})(\d{4})">$1 $2 $3 $4</intlNumberFormat>
- <numberFormat leadingDigits="[89]0"
- pattern="([89]00)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <intlNumberFormat leadingDigits="[89]0"
- pattern="([89]00)(\d{3})(\d{4})">$1 $2 $3</intlNumberFormat>
+ <numberFormat pattern="([358]\d)(\d{4})(\d{4})">
+ <leadingDigits>33|55|81</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <intlNumberFormat pattern="([358]\d)(\d{4})(\d{4})">
+ <leadingDigits>33|55|81</leadingDigits>
+ <format>$1 $2 $3</format>
+ </intlNumberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>[2467]|3[12457-9]|5[89]|8[02-9]|9[0-35-9]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <intlNumberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>[2467]|3[12457-9]|5[89]|8[02-9]|9[0-35-9]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </intlNumberFormat>
+ <numberFormat nationalPrefixFormattingRule="$FG"
+ pattern="1([358]\d)(\d{4})(\d{4})">
+ <leadingDigits>1(?:33|55|81)</leadingDigits>
+ <format>045 $1 $2 $3</format>
+ </numberFormat>
+ <intlNumberFormat pattern="(1)([358]\d)(\d{4})(\d{4})">
+ <leadingDigits>1(?:33|55|81)</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </intlNumberFormat>
+ <numberFormat nationalPrefixFormattingRule="$FG"
+ pattern="1(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>1(?:[2467]|3[12457-9]|5[89]|8[2-9]|9[1-35-9])</leadingDigits>
+ <format>045 $1 $2 $3</format>
+ </numberFormat>
+ <intlNumberFormat pattern="(1)(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>1(?:[2467]|3[12457-9]|5[89]|8[2-9]|9[1-35-9])</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </intlNumberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-9]\d{9,10}</nationalNumberPattern>
@@ -4620,18 +5279,30 @@
<territory id="MY" countryCode="60" internationalPrefix="00"
nationalPrefix="0">
<availableFormats>
- <numberFormat leadingDigits="[4-79]" nationalPrefixFormattingRule="$NP$FG"
- pattern="([4-79])(\d{3})(\d{4})">$1-$2 $3</numberFormat>
- <numberFormat leadingDigits="3" nationalPrefixFormattingRule="$NP$FG"
- pattern="(3)(\d{4})(\d{4})">$1-$2 $3</numberFormat>
- <numberFormat leadingDigits="8" nationalPrefixFormattingRule="$NP$FG"
- pattern="(8[2-9])(\d{3})(\d{3})">$1-$2 $3</numberFormat>
- <numberFormat leadingDigits="1[0-46-9][1-9]" nationalPrefixFormattingRule="$NP$FG"
- pattern="(1\d)(\d{3})(\d{4})">$1-$2 $3</numberFormat>
- <numberFormat leadingDigits="1[36-8]0"
- pattern="(1)([36-8]00)(\d{2})(\d{4})">$1-$2-$3-$4</numberFormat>
- <numberFormat leadingDigits="15" nationalPrefixFormattingRule="$NP$FG"
- pattern="(154)(\d{3})(\d{4})">$1-$2 $3</numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$NP$FG"
+ pattern="([4-79])(\d{3})(\d{4})">
+ <leadingDigits>[4-79]</leadingDigits>
+ <format>$1-$2 $3</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$NP$FG"
+ pattern="(3)(\d{4})(\d{4})">
+ <leadingDigits>3</leadingDigits>
+ <format>$1-$2 $3</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$NP$FG"
+ pattern="([18]\d)(\d{3})(\d{3,4})">
+ <leadingDigits>1[0-46-9][1-9]|8</leadingDigits>
+ <format>$1-$2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(1)([36-8]00)(\d{2})(\d{4})">
+ <leadingDigits>1[36-8]0</leadingDigits>
+ <format>$1-$2-$3-$4</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$NP$FG"
+ pattern="(154)(\d{3})(\d{4})">
+ <leadingDigits>15</leadingDigits>
+ <format>$1-$2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[13-9]\d{7,9}</nationalNumberPattern>
@@ -4673,12 +5344,14 @@
<!-- http://www.itu.int/oth/T0202000091/en -->
<territory id="MZ" countryCode="258" internationalPrefix="00">
<availableFormats>
- <numberFormat leadingDigits="2"
- pattern="(2\d)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="8[24]"
- pattern="(8[24])(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="80"
- pattern="(80\d)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([28]\d)(\d{3})(\d{3,4})">
+ <leadingDigits>2|8[24]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(80\d)(\d{3})(\d{3})">
+ <leadingDigits>80</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[28]\d{7,8}</nationalNumberPattern>
@@ -4711,22 +5384,40 @@
<territory id="NA" countryCode="264" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="8[15]"
- pattern="(8\d)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <!-- This overlaps by necessity with the next pattern, so as it is more
- specific, it is listed first. The area code is actually 632532, but
- leadingDigits length is limited to 4.-->
- <numberFormat leadingDigits="6325" pattern="(632532)(\d{2,4})">$1 $2</numberFormat>
- <numberFormat leadingDigits="6(?:1|[245][1-7]|3[125-7]|6[1256]|7[1236])"
- pattern="(6\d)(\d{2,3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(8\d)(\d{3})(\d{4})">
+ <leadingDigits>8[15]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <!-- This overlaps with the next pattern so is listed first. -->
+ <numberFormat pattern="(632532)(\d{2,4})">
+ <leadingDigits>632</leadingDigits>
+ <leadingDigits>6325</leadingDigits>
+ <leadingDigits>63253</leadingDigits>
+ <leadingDigits>632532</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(6\d)(\d{2,3})(\d{4})">
+ <leadingDigits>6(?:1|[245][1-7]|3[125-7]|6[1256]|7[1236])</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
<!-- Another overlap pattern - this one is for shorter numbers. -->
- <numberFormat leadingDigits="6(?:3[12567]|5[3-5]|6[1256]|7[1236])"
- pattern="(6\d)(\d{4,5})">$1 $2</numberFormat>
- <numberFormat leadingDigits="6[2356]8" pattern="(6\d{2})(\d{4,6})">$1 $2</numberFormat>
- <numberFormat leadingDigits="6(?:342|6[34]|751)"
- pattern="(6\d{3})(\d{4,5})">$1 $2</numberFormat>
- <numberFormat leadingDigits="88"
- pattern="(88)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(6\d)(\d{4,5})">
+ <leadingDigits>6(?:3[12567]|5[3-5]|6[1256]|7[1236])</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(6\d{2})(\d{4,6})">
+ <leadingDigits>6[2356]8</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(6\d{3})(\d{4,5})">
+ <leadingDigits>6(?:34|6[34]|75)</leadingDigits>
+ <leadingDigits>6(?:342|6[34]|751)</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(88)(\d{3})(\d{3})">
+ <leadingDigits>88</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[68]\d{5,9}</nationalNumberPattern>
@@ -4759,11 +5450,13 @@
<!-- http://www.itu.int/oth/T020200009B/en -->
<territory id="NE" countryCode="227" internationalPrefix="00">
<availableFormats>
- <numberFormat>
- <numberFormat leadingDigits="[29]|09"
- pattern="([029]\d)(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
- <numberFormat leadingDigits="08"
- pattern="(08)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([029]\d)(\d{2})(\d{2})(\d{2})">
+ <leadingDigits>[29]|09</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
+ <numberFormat pattern="(08)(\d{3})(\d{3})">
+ <leadingDigits>08</leadingDigits>
+ <format>$1 $2 $3</format>
</numberFormat>
</availableFormats>
<generalDesc>
@@ -4799,24 +5492,34 @@
<territory id="NG" countryCode="234" internationalPrefix="009"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="[12]"
- pattern="([12])(\d{3})(\d{3,4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="9"
- pattern="(9)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[3-6]|7(?:[1-79]|0[1-9])|8[2-9]"
- pattern="([3-8]\d)(\d{3})(\d{2,3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="70[3-9]|8(?:0[1-9]|1[23])"
- pattern="([78]\d{2})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="702|819"
- pattern="([78]\d{3})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[78]00"
- pattern="([78]00)(\d{3})(\d{3,4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[78]00"
- pattern="([78]00)(\d{4})(\d{4,5})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[78]00"
- pattern="([78]00)(\d{5})(\d{5,6})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="78"
- pattern="(78)(\d{2})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([129])(\d{3})(\d{3,4})">
+ <leadingDigits>[129]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([3-8]\d)(\d{3})(\d{2,3})">
+ <leadingDigits>[3-6]|7(?:[1-79]|0[1-9])|8[2-9]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([78]\d{2})(\d{3})(\d{3,4})">
+ <leadingDigits>70[03-9]|8(?:0|1[23])</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([78]\d{3})(\d{3})(\d{3})">
+ <leadingDigits>702|819</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([78]00)(\d{4})(\d{4,5})">
+ <leadingDigits>[78]00</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([78]00)(\d{5})(\d{5,6})">
+ <leadingDigits>[78]00</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(78)(\d{2})(\d{3})">
+ <leadingDigits>78</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-69]\d{5,8}|[78]\d{5,13}</nationalNumberPattern>
@@ -4857,12 +5560,22 @@
<territory id="NL" countryCode="31" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="1[035]|2[0346]|3[03568]|4[0356]|5[0358]|7|8[458]"
- pattern="([1-578]\d)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="1[16-8]|2[259]|3[124]|4[17-9]|5[124679]"
- pattern="([1-5]\d{2})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="6" pattern="(6)(\d{8})">$1 $2</numberFormat>
- <numberFormat leadingDigits="80|9" pattern="([89]0\d)(\d{4,7})">$1 $2</numberFormat>
+ <numberFormat pattern="([1-578]\d)(\d{3})(\d{4})">
+ <leadingDigits>1[035]|2[0346]|3[03568]|4[0356]|5[0358]|7|8[458]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([1-5]\d{2})(\d{3})(\d{3})">
+ <leadingDigits>1[16-8]|2[259]|3[124]|4[17-9]|5[124679]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(6)(\d{8})">
+ <leadingDigits>6</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="([89]0\d)(\d{4,7})">
+ <leadingDigits>80|9</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-9]\d{6,9}</nationalNumberPattern>
@@ -4899,10 +5612,14 @@
http://www.npt.no/portal/page/portal/PG_NPT_NO_EN/PAG_NPT_EN_HOME/PAG_RESOURCE_TEXT -->
<territory id="NO" countryCode="47" internationalPrefix="00">
<availableFormats>
- <numberFormat leadingDigits="[489]"
- pattern="([489]\d{2})(\d{2})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[235-7]"
- pattern="([235-7]\d)(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="([489]\d{2})(\d{2})(\d{3})">
+ <leadingDigits>[489]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([235-7]\d)(\d{2})(\d{2})(\d{2})">
+ <leadingDigits>[235-7]</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>0\d{4}|[2-9]\d{7}</nationalNumberPattern>
@@ -4948,13 +5665,19 @@
<territory id="NP" countryCode="977" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="1[4-6]"
- pattern="(1)([4-6]\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="1[01]|[2-8]|9[1-79]"
- pattern="(\d{2})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(1)([4-6]\d{3})(\d{3})">
+ <leadingDigits>1[4-6]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{3})(\d{3})">
+ <leadingDigits>1[01]|[2-8]|9[1-79]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
<!-- Format is from http://www.fco.gov.uk/en/travel-and-living-abroad/travel-advice-by-country/country-profile/asia-oceania/nepal/ -->
- <numberFormat leadingDigits="98"
- pattern="(98[45])(\d{3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(98[45])(\d{3})(\d{4})">
+ <leadingDigits>98</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-8]\d{5,7}|98[45]\d{7}</nationalNumberPattern>
@@ -4991,24 +5714,36 @@
<territory id="NZ" countryCode="64" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="[3467]|9[1-9]"
- pattern="([34679])(\d{3})(\d{4})">$1-$2 $3</numberFormat>
+ <numberFormat pattern="([34679])(\d{3})(\d{4})">
+ <leadingDigits>[3467]|9[1-9]</leadingDigits>
+ <format>$1-$2 $3</format>
+ </numberFormat>
<!-- Mobile numbers do not have exclusive leading digits - formatting
depends on number length.-->
<!-- Vodafone numbers are formatted with 021 separated. -->
- <numberFormat leadingDigits="21"
- pattern="(21)(\d{4})(\d{3,4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(21)(\d{4})(\d{3,4})">
+ <leadingDigits>21</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
<!-- Adding in the toll free numbers here as well since they follow the
same format. -->
- <numberFormat leadingDigits="2[0247-9]|5|[89]00"
- pattern="([2589]\d{2})(\d{3})(\d{3,4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([2589]\d{2})(\d{3})(\d{3,4})">
+ <leadingDigits>2[0247-9]|5|[89]00</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
<!-- Vodafone and Orcon numbers can also be 8 digits (without leading
- 0), and these are formatted differently. -->
- <numberFormat leadingDigits="2[019]"
- pattern="(2[019])(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ 0), and these are formatted differently. -->
+ <numberFormat pattern="(2[019])(\d{3})(\d{3})">
+ <leadingDigits>2[019]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
<!-- Antarctica -->
- <numberFormat leadingDigits="24099"
- pattern="(24099)(\d{3})">$1 $2</numberFormat>
+ <numberFormat pattern="(24099)(\d{3})">
+ <leadingDigits>240</leadingDigits>
+ <leadingDigits>2409</leadingDigits>
+ <leadingDigits>24099</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2-9]\d{7,9}</nationalNumberPattern>
@@ -5049,10 +5784,18 @@
<!-- http://www.itu.int/oth/T020200009F/en -->
<territory id="OM" countryCode="968" internationalPrefix="00" >
<availableFormats>
- <numberFormat leadingDigits="2" pattern="(2\d)(\d{6})">$1 $2</numberFormat>
- <numberFormat leadingDigits="9" pattern="(9\d{3})(\d{4})">$1 $2</numberFormat>
- <numberFormat leadingDigits="8" pattern="(800)(7\d{4,5})">$1 $2</numberFormat>
- <numberFormat leadingDigits="5" pattern="(500)(\d{4})">$1 $2</numberFormat>
+ <numberFormat pattern="(2\d)(\d{6})">
+ <leadingDigits>2</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(9\d{3})(\d{4})">
+ <leadingDigits>9</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="([58]00)(\d{4,6})">
+ <leadingDigits>[58]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>(?:2[3-6]|5|9[2-9])\d{6}|800\d{5,6}</nationalNumberPattern>
@@ -5095,11 +5838,22 @@
nationalPrefix="0" nationalPrefixFormattingRule="($FG)"
preferredExtnPrefix=" Anexo ">
<availableFormats>
- <numberFormat leadingDigits="19" pattern="(1)(9\d{2})(\d{6})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="1[0-8]" pattern="(1)(\d{8})">$1 $2</numberFormat>
- <numberFormat leadingDigits="[4-8]\d[0-8]" pattern="([4-8]\d)(\d{6})">$1 $2</numberFormat>
- <numberFormat leadingDigits="[4-8]\d9"
- pattern="([4-8]\d)(9\d{2})(\d{6})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(1)(9\d{2})(\d{6})">
+ <leadingDigits>19</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(1)(\d{8})">
+ <leadingDigits>1[0-8]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="([4-8]\d)(\d{6})">
+ <leadingDigits>[4-8]\d[0-8]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="([4-8]\d)(9\d{2})(\d{6})">
+ <leadingDigits>[4-8]\d9</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<!-- The explicit requirements for numbers beginning with 5 are because
@@ -5129,9 +5883,14 @@
<!-- http://en.wikipedia.org/wiki/%2B675 -->
<territory id="PG" countryCode="675" internationalPrefix="00">
<availableFormats>
- <numberFormat leadingDigits="[1-689]" pattern="(\d{3})(\d{4})">$1 $2</numberFormat>
- <numberFormat leadingDigits="7[1-36]"
- pattern="(7[1-36]\d)(\d{2})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(\d{3})(\d{4})">
+ <leadingDigits>[1-689]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(7[1-36]\d)(\d{2})(\d{3})">
+ <leadingDigits>7[1-36]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-9]\d{6,7}</nationalNumberPattern>
@@ -5171,24 +5930,44 @@
<availableFormats>
<!--Area code separated from number. Area codes found here:
http://en.wikipedia.org/wiki/Telecommunications_in_the_Philippines#Area_Codes-->
- <numberFormat leadingDigits="2" nationalPrefixFormattingRule="($NP$FG)"
- pattern="(2)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="3(?:230|397|461)|4(?:2(?:35|[46]4|51)|396|4(?:22|63)|59[347]|76[15])|5(?:221|446)|642[23]|8(?:622|8(?:[24]2|5[13]))" nationalPrefixFormattingRule="($NP$FG)"
- pattern="(\d{4})(\d{5})">$1 $2</numberFormat>
- <numberFormat leadingDigits="3469|4(?:279|9(?:30|56))|8834"
- nationalPrefixFormattingRule="($NP$FG)"
- pattern="(\d{5})(\d{4})">$1 $2</numberFormat>
+ <numberFormat nationalPrefixFormattingRule="($NP$FG)"
+ pattern="(2)(\d{3})(\d{4})">
+ <leadingDigits>2</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="($NP$FG)"
+ pattern="(\d{4})(\d{5})">
+ <leadingDigits>3(?:23|39|46)|4(?:2[3-6]|[35]9|4[26]|76)|5(?:22|44)|642|8(?:62|8[245])</leadingDigits>
+ <leadingDigits>3(?:230|397|461)|4(?:2(?:35|[46]4|51)|396|4(?:22|63)|59[347]|76[15])|5(?:221|446)|642[23]|8(?:622|8(?:[24]2|5[13]))</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="($NP$FG)"
+ pattern="(\d{5})(\d{4})">
+ <leadingDigits>346|4(?:27|9[35])|883</leadingDigits>
+ <leadingDigits>3469|4(?:279|9(?:30|56))|8834</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
<!-- This rule is a fallback for the more specific area codes.-->
- <numberFormat leadingDigits="[3-8]" nationalPrefixFormattingRule="($NP$FG)"
- pattern="([3-8]\d)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="9" nationalPrefixFormattingRule="$NP$FG"
- pattern="(9\d{2})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat nationalPrefixFormattingRule="($NP$FG)"
+ pattern="([3-8]\d)(\d{3})(\d{4})">
+ <leadingDigits>[3-8]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$NP$FG"
+ pattern="(9\d{2})(\d{3})(\d{4})">
+ <leadingDigits>9</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
<!-- Formatting from
http://www.uniontelecard.com/calling-guides/philippines/guide1.aspx -->
- <numberFormat leadingDigits="1"
- pattern="(1800)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="1"
- pattern="(1800)(\d{1,2})(\d{3})(\d{4})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="(1800)(\d{3})(\d{4})">
+ <leadingDigits>1</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(1800)(\d{1,2})(\d{3})(\d{4})">
+ <leadingDigits>1</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2-9]\d{7,9}|1800\d{7,9}</nationalNumberPattern>
@@ -5220,13 +5999,18 @@
<territory id="PK" countryCode="92" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="21|42" pattern="([24]\d)(\d{4})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat
- leadingDigits="2[25]|4[0146-9]|5[1-35-8]|6[1-8]|7[14]|8[16]|91"
- pattern="(\d{2})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="2[349]|3|45|54|60|72|8[2-5]|9[2-9]"
- pattern="(\d{3})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="89" pattern="([89]00)(\d{3})(\d{2})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{3})(\d{4})">
+ <leadingDigits>2[25]|4[0146-9]|5[1-35-8]|6[1-8]|7[14]|8[16]|91</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{4})(\d{4})">
+ <leadingDigits>21|42</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{2,4})">
+ <leadingDigits>2[349]|3|45|54|60|72|8[02-5]|9[02-9]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2-9]\d{7,9}</nationalNumberPattern>
@@ -5260,10 +6044,14 @@
(in Polish) -->
<territory id="PL" countryCode="48" internationalPrefix="00">
<availableFormats>
- <numberFormat leadingDigits="[124]|3[2-4]|5[24-689]|6[1-3578]|7[014-7]|8[1-79]|9[145]"
- pattern="(\d{2})(\d{3})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
- <numberFormat leadingDigits="39|5[013]|6[069]|7[289]|8[08]"
- pattern="(\d{3})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{3})(\d{2})(\d{2})">
+ <leadingDigits>[124]|3[2-4]|5[24-689]|6[1-3578]|7[14-7]|8[1-79]|9[145]</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{3})">
+ <leadingDigits>39|5[013]|6[069]|7[0289]|8[08]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-9]\d{8}</nationalNumberPattern>
@@ -5338,7 +6126,9 @@
<!-- http://www.anacom.pt/render.jsp?categoryId=279098 -->
<territory id="PT" countryCode="351" internationalPrefix="00">
<availableFormats>
- <numberFormat pattern="([2-46-9]\d{2})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([2-46-9]\d{2})(\d{3})(\d{3})">
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2-46-9]\d{8}</nationalNumberPattern>
@@ -5380,7 +6170,9 @@
<!-- http://wtng.info/wtng-qq.html -->
<territory id="QA" countryCode="974" internationalPrefix="00">
<availableFormats>
- <numberFormat pattern="([3-8]\d{2})(\d{4})">$1 $2</numberFormat>
+ <numberFormat pattern="([3-8]\d{2})(\d{4})">
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[3-8]\d{6}</nationalNumberPattern>
@@ -5410,7 +6202,9 @@
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG"
leadingDigits="262|6[49]|8" mainCountryForCode="true" >
<availableFormats>
- <numberFormat pattern="([268]\d{2})(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="([268]\d{2})(\d{2})(\d{2})(\d{2})">
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[268]\d{8}</nationalNumberPattern>
@@ -5446,10 +6240,14 @@
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG"
preferredExtnPrefix=" int ">
<availableFormats>
- <numberFormat leadingDigits="[23]1|7"
- pattern="([237]\d)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[23][02-9]|[89]"
- pattern="(\d{3})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([237]\d)(\d{3})(\d{4})">
+ <leadingDigits>[23]1|7</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{3})">
+ <leadingDigits>[23][02-9]|[89]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[237-9]\d{8}</nationalNumberPattern>
@@ -5491,13 +6289,22 @@
<territory id="RS" countryCode="381" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="(?:2[389]|39)0"
- pattern="([23]\d{2})(\d{4,7})">$1 $2</numberFormat>
- <numberFormat leadingDigits="1|2(?:[0-24-7]|[389][1-9])|3(?:[0-8]|9[1-9])"
- pattern="([1-3]\d)(\d{5,8})">$1 $2</numberFormat>
- <numberFormat leadingDigits="6" pattern="(6[0-689])(\d{3,10})">$1 $2</numberFormat>
- <numberFormat leadingDigits="42" pattern="(42)(\d{4,7})">$1 $2</numberFormat>
- <numberFormat leadingDigits="[89]" pattern="([89]0\d)(\d{3,6})">$1 $2</numberFormat>
+ <numberFormat pattern="([23]\d{2})(\d{4,7})">
+ <leadingDigits>(?:2[389]|39)0</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="([1-4]\d)(\d{4,8})">
+ <leadingDigits>1|2(?:[0-24-7]|[389][1-9])|3(?:[0-8]|9[1-9])|42</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(6[0-689])(\d{3,10})">
+ <leadingDigits>6</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="([89]0\d)(\d{3,6})">
+ <leadingDigits>[89]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-46-9]\d{4,11}</nationalNumberPattern>
@@ -5535,10 +6342,14 @@
<!-- Formatting from wikipedia, confirmed on Goverment websites such
as http://www.minjust.ru/ru/structure/contact/. Contains formatting
instructions for Kazakhstan as well. -->
- <numberFormat leadingDigits="[34689]"
- pattern="([34689]\d{2})(\d{3})(\d{2})(\d{2})">$1 $2-$3-$4</numberFormat>
- <numberFormat leadingDigits="7"
- pattern="([7]\d{2})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([34689]\d{2})(\d{3})(\d{2})(\d{2})">
+ <leadingDigits>[34689]</leadingDigits>
+ <format>$1 $2-$3-$4</format>
+ </numberFormat>
+ <numberFormat pattern="([7]\d{2})(\d{3})(\d{4})">
+ <leadingDigits>7</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[3489]\d{9}</nationalNumberPattern>
@@ -5571,10 +6382,15 @@
<territory id="RW" countryCode="250" internationalPrefix="000"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="2" nationalPrefixFormattingRule="$FG"
- pattern="(25\d)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[7-9]"
- pattern="([7-9]\d{2})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$FG"
+ pattern="(25\d)(\d{3})(\d{3})">
+ <leadingDigits>2</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([7-9]\d{2})(\d{3})(\d{3})">
+ <leadingDigits>[7-9]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[27-9]\d{8}</nationalNumberPattern>
@@ -5604,12 +6420,26 @@
<territory id="SA" countryCode="966" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="[1-467]"
- pattern="([1-467])(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="9" pattern="(9200)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="5" pattern="(5\d)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="80" pattern="(800)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="81" pattern="(8111)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([1-467])(\d{3})(\d{4})">
+ <leadingDigits>[1-467]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(9200)(\d{3})(\d{4})">
+ <leadingDigits>9</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(5\d)(\d{3})(\d{4})">
+ <leadingDigits>5</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(800)(\d{3})(\d{4})">
+ <leadingDigits>80</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(8111)(\d{3})(\d{3})">
+ <leadingDigits>81</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-9]\d{7,10}</nationalNumberPattern>
@@ -5649,7 +6479,9 @@
<territory id="SC" countryCode="248" internationalPrefix="0[0-2]"
preferredInternationalPrefix="00">
<availableFormats>
- <numberFormat pattern="(\d{3})(\d{3})">$1 $2</numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})">
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2-8]\d{5}</nationalNumberPattern>
@@ -5689,26 +6521,38 @@
<territory id="SE" countryCode="46" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="8"
- pattern="(8)(\d{2,3})(\d{2,3})(\d{2})">$1 $2 $3 $4</numberFormat>
- <numberFormat leadingDigits="1[013689]|2[136]|3[1356]|4[0246]|54|6[03]|90"
- pattern="([1-69]\d)(\d{2,3})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
- <numberFormat leadingDigits="1[13689]|2[136]|3[1356]|4[0246]|54|6[03]|90"
- pattern="([1-69]\d)(\d{3})(\d{2})">$1 $2 $3</numberFormat>
- <numberFormat
- leadingDigits="1[2457]|2[2457-9]|3[0247-9]|4[1357-9]|5[0-35-9]|6[124-9]|9(?:[125-8]|3[0-5]|4[0-3])"
- pattern="(\d{3})(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
- <numberFormat
- leadingDigits="1[2457]|2[2457-9]|3[0247-9]|4[1357-9]|5[0-35-9]|6[124-9]|9(?:[125-8]|3[0-5]|4[0-3])"
- pattern="(\d{3})(\d{2,3})(\d{2})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="7[02-46]"
- pattern="(7[02-46])(\d{3})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
- <numberFormat leadingDigits="20"
- pattern="(20)(\d{2,3})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
- <numberFormat leadingDigits="20"
- pattern="(20)(\d{2,3})(\d{2})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="9[034]"
- pattern="(9[034]\d)(\d{2})(\d{2})(\d{3})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="(8)(\d{2,3})(\d{2,3})(\d{2})">
+ <leadingDigits>8</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
+ <numberFormat pattern="([1-69]\d)(\d{2,3})(\d{2})(\d{2})">
+ <leadingDigits>1[013689]|2[0136]|3[1356]|4[0246]|54|6[03]|90</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
+ <numberFormat pattern="([1-69]\d)(\d{3})(\d{2})">
+ <leadingDigits>1[13689]|2[136]|3[1356]|4[0246]|54|6[03]|90</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{2})(\d{2})(\d{2})">
+ <leadingDigits>1[2457]|2[2457-9]|3[0247-9]|4[1357-9]|5[0-35-9]|6[124-9]|9(?:[125-8]|3[0-5]|4[0-3])</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{2,3})(\d{2})">
+ <leadingDigits>1[2457]|2[2457-9]|3[0247-9]|4[1357-9]|5[0-35-9]|6[124-9]|9(?:[125-8]|3[0-5]|4[0-3])</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(7[02-46])(\d{3})(\d{2})(\d{2})">
+ <leadingDigits>7[02-46]</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
+ <numberFormat pattern="(20)(\d{2,3})(\d{2})">
+ <leadingDigits>20</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(9[034]\d)(\d{2})(\d{2})(\d{3})">
+ <leadingDigits>9[034]</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>\d{7,10}</nationalNumberPattern>
@@ -5740,12 +6584,18 @@
<!-- http://www.ida.gov.sg/policies%20and%20regulation/20060508120124.aspx -->
<territory id="SG" countryCode="65" internationalPrefix="0[0-3][0-9]">
<availableFormats>
- <numberFormat leadingDigits="[369]|8[1-9]"
- pattern="([3689]\d{3})(\d{4})">$1 $2</numberFormat>
- <numberFormat leadingDigits="1[89]"
- pattern="(1[89]00)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="80"
- pattern="(800)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([3689]\d{3})(\d{4})">
+ <leadingDigits>[369]|8[1-9]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(1[89]00)(\d{3})(\d{4})">
+ <leadingDigits>1[89]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(800)(\d{3})(\d{4})">
+ <leadingDigits>80</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[13689]\d{7,10}</nationalNumberPattern>
@@ -5782,22 +6632,38 @@
<territory id="SI" countryCode="386" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="[12]|3[4-8]|4[24-8]|5[4-8]|7[3-8]"
- pattern="(\d)(\d{3})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
- <numberFormat leadingDigits="[37][01]|4[019]|51|64"
- pattern="([3-7]\d)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[89]" pattern="([89]0)(\d{4,6})">$1 $2</numberFormat>
+ <numberFormat nationalPrefixFormattingRule="($NP$FG)"
+ pattern="(\d)(\d{3})(\d{2})(\d{2})">
+ <leadingDigits>[12]|3[4-8]|4[24-8]|5[3-8]|7[3-8]</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
+ <numberFormat pattern="([3-7]\d)(\d{3})(\d{3})">
+ <leadingDigits>[37][01]|4[019]|51|64</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([89][09])(\d{3,6})">
+ <leadingDigits>[89][09]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="([58]\d{2})(\d{5})">
+ <leadingDigits>59|8[1-3]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
- <nationalNumberPattern>[1-9]\d{5,7}</nationalNumberPattern>
- <possibleNumberPattern>\d{6,8}</possibleNumberPattern>
+ <nationalNumberPattern>[1-7]\d{6,7}|[89]\d{4,7}</nationalNumberPattern>
+ <possibleNumberPattern>\d{5,8}</possibleNumberPattern>
</generalDesc>
<fixedLine>
- <nationalNumberPattern>[1-57]\d{6}</nationalNumberPattern>
+ <nationalNumberPattern>(?:1\d|2[2-8]|3[4-8]|4[24-8]|[57][3-8])\d{6}</nationalNumberPattern>
<possibleNumberPattern>\d{7,8}</possibleNumberPattern>
- <exampleNumber>1123456</exampleNumber>
+ <exampleNumber>11234567</exampleNumber>
</fixedLine>
<mobile>
+ <!-- We include 049 here - it is VoIP in the plan, but successful
+ delivery has been performed by mobile - and it is run by Mobitel.
+ There are also mobile numbers found on the internet with this prefix -
+ it is apparently used in Kosovo. -->
<nationalNumberPattern>(?:[37][01]|4[019]|51|64)\d{6}</nationalNumberPattern>
<possibleNumberPattern>\d{8}</possibleNumberPattern>
<exampleNumber>31234567</exampleNumber>
@@ -5808,10 +6674,16 @@
<exampleNumber>80123456</exampleNumber>
</tollFree>
<premiumRate>
- <nationalNumberPattern>90\d{4,6}</nationalNumberPattern>
- <possibleNumberPattern>\d{6,8}</possibleNumberPattern>
+ <!-- Includes televoting, mass calling-->
+ <nationalNumberPattern>90\d{4,6}|89[1-3]\d{2,5}</nationalNumberPattern>
+ <possibleNumberPattern>\d{5,8}</possibleNumberPattern>
<exampleNumber>90123456</exampleNumber>
</premiumRate>
+ <voip>
+ <nationalNumberPattern>(?:59|8[1-3])\d{6}</nationalNumberPattern>
+ <possibleNumberPattern>\d{8}</possibleNumberPattern>
+ <exampleNumber>59012345</exampleNumber>
+ </voip>
</territory>
<!-- Slovakia -->
@@ -5819,12 +6691,18 @@
<territory id="SK" countryCode="421" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="2"
- pattern="(2)(\d{3})(\d{3})(\d{2})">$1/$2 $3 $4</numberFormat>
- <numberFormat leadingDigits="[3-5]"
- pattern="([3-5]\d)(\d{3})(\d{2})(\d{2})">$1/$2 $3 $4</numberFormat>
- <numberFormat leadingDigits="[689]"
- pattern="([689]\d{2})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(2)(\d{3})(\d{3})(\d{2})">
+ <leadingDigits>2</leadingDigits>
+ <format>$1/$2 $3 $4</format>
+ </numberFormat>
+ <numberFormat pattern="([3-5]\d)(\d{3})(\d{2})(\d{2})">
+ <leadingDigits>[3-5]</leadingDigits>
+ <format>$1/$2 $3 $4</format>
+ </numberFormat>
+ <numberFormat pattern="([689]\d{2})(\d{3})(\d{3})">
+ <leadingDigits>[689]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2-689]\d{8}</nationalNumberPattern>
@@ -5865,7 +6743,9 @@
<availableFormats>
<!-- Following formatting of online yellow pages
www.leonedirect.com -->
- <numberFormat pattern="(\d{2})(\d{6})">$1 $2</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{6})">
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2-578]\d{7}</nationalNumberPattern>
@@ -5895,7 +6775,9 @@
<availableFormats>
<!-- Using yellow pages and online telecom company formatting, rather
than that implied in the national numbering plan. -->
- <numberFormat pattern="(\d{2})(\d{3})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{3})(\d{2})(\d{2})">
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[37]\d{8}</nationalNumberPattern>
@@ -5928,12 +6810,16 @@
<availableFormats>
<!-- These follow formats online, such as www.hortel.net/contact_us.html
-->
- <numberFormat leadingDigits="[13-5]"
- pattern="([13-5])(\d{6})">$1 $2</numberFormat>
+ <numberFormat pattern="([13-5])(\d{6})">
+ <leadingDigits>[13-5]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
<!-- Unfortunately numbers beginning with 1 are hard to format based on
prefixes, since it depends on number length. -->
- <numberFormat leadingDigits="[19]"
- pattern="([19]\d)(\d{6})">$1 $2</numberFormat>
+ <numberFormat pattern="([19]\d)(\d{6})">
+ <leadingDigits>[19]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[13-59]\d{6,7}</nationalNumberPattern>
@@ -5960,7 +6846,9 @@
<!-- http://www.itu.int/oth/T02020000B6/en -->
<territory id="ST" countryCode="239" internationalPrefix="00">
<availableFormats>
- <numberFormat pattern="(\d{3})(\d{4})">$1 $2</numberFormat>
+ <numberFormat pattern="(\d{3})(\d{4})">
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[29]\d{6}</nationalNumberPattern>
@@ -5985,12 +6873,14 @@
<territory id="SY" countryCode="963" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="[13]"
- pattern="([13]\d)(\d{3})(\d{3,4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[245]"
- pattern="([245]\d)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="9"
- pattern="(9[3-689])(\d{4})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{3})(\d{3,4})">
+ <leadingDigits>[1-5]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(9[3-689])(\d{4})(\d{3})">
+ <leadingDigits>9</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-59]\d{7,8}</nationalNumberPattern>
@@ -6016,16 +6906,20 @@
<!-- Note this plan is scheduled to change in April and again in August in
2010 so should be updated at that time. -->
<territory id="SZ" countryCode="268" internationalPrefix="00">
+ <availableFormats>
+ <numberFormat pattern="(\d{3})(\d{4})">
+ <leadingDigits>[2-6]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{4})(\d{4})">
+ <leadingDigits>7</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ </availableFormats>
<generalDesc>
<nationalNumberPattern>[2-7]\d{6,7}</nationalNumberPattern>
<possibleNumberPattern>\d{7,8}</possibleNumberPattern>
</generalDesc>
- <availableFormats>
- <numberFormat leadingDigits="[2-6]"
- pattern="(\d{3})(\d{4})">$1 $2</numberFormat>
- <numberFormat leadingDigits="7"
- pattern="(\d{4})(\d{4})">$1 $2</numberFormat>
- </availableFormats>
<fixedLine>
<!-- The leading optional 2 is because future changes to the fixed-line
plan will be made by prepending a two to fixed-line numbers. -->
@@ -6083,7 +6977,9 @@
internationalPrefix="00|16">
<availableFormats>
<numberFormat
- pattern="(\d{2})(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
+ pattern="(\d{2})(\d{2})(\d{2})(\d{2})">
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2679]\d{7}</nationalNumberPattern>
@@ -6111,7 +7007,9 @@
<!-- http://www.itu.int/oth/T02020000D1/en -->
<territory id="TG" countryCode="228" internationalPrefix="00">
<availableFormats>
- <numberFormat pattern="(\d{3})(\d{2})(\d{2})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(\d{3})(\d{2})(\d{2})">
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[02-9]\d{6}</nationalNumberPattern>
@@ -6135,16 +7033,26 @@
<availableFormats>
<!-- Formatting patterns from wikipedia and the document itself -
http://en.wikipedia.org/wiki/%2B66 -->
- <numberFormat leadingDigits="2" pattern="(2)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="6" pattern="(60)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[3-57]"
- pattern="([3-57]\d)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="8" pattern="(8)(\d{4})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="1" nationalPrefixFormattingRule="$FG"
- pattern="(1[89]00)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(2)(\d{3})(\d{4})">
+ <leadingDigits>2</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([3-7]\d)(\d{3})(\d{3,4})">
+ <leadingDigits>[3-7]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(8)(\d{4})(\d{4})">
+ <leadingDigits>8</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$FG"
+ pattern="(1[89]00)(\d{3})(\d{3})">
+ <leadingDigits>1</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
- <nationalNumberPattern>[1-8]\d{7,9}</nationalNumberPattern>
+ <nationalNumberPattern>[2-8]\d{7,8}|1\d{9}</nationalNumberPattern>
<possibleNumberPattern>\d{8,10}</possibleNumberPattern>
</generalDesc>
<fixedLine>
@@ -6182,14 +7090,26 @@
<territory id="TJ" countryCode="992" internationalPrefix="8~10"
nationalPrefix="8" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="[34]7|91[78]"
- pattern="([349]\d{2})(\d{2})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="4[48]" pattern="(4[48])(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="3317" pattern="(331700)(\d)(\d{2})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="3(?:[1245]|3(?:[02-9]|1[0-589]))"
- pattern="(\d{4})(\d)(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="9(?:19|[0235-9])"
- pattern="(9\d)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([349]\d{2})(\d{2})(\d{4})">
+ <leadingDigits>[34]7|91[78]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([49]\d)(\d{3})(\d{4})">
+ <leadingDigits>4[48]|9(?:19|[0235-9])</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(331700)(\d)(\d{2})">
+ <leadingDigits>331</leadingDigits>
+ <leadingDigits>3317</leadingDigits>
+ <leadingDigits>33170</leadingDigits>
+ <leadingDigits>331700</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{4})(\d)(\d{4})">
+ <leadingDigits>3[1-5]</leadingDigits>
+ <leadingDigits>3(?:[1245]|3(?:[02-9]|1[0-589]))</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[349]\d{8}</nationalNumberPattern>
@@ -6225,7 +7145,9 @@
<!-- There doesn't seem to be a standardized format. The format below is based on the
Turkmenistan embassy at
http://www.turkmenistanembassy.org/turkmen/info/contact.html-->
- <numberFormat pattern="([1-6]\d)(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="([1-6]\d)(\d{2})(\d{2})(\d{2})">
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-6]\d{7}</nationalNumberPattern>
@@ -6248,7 +7170,9 @@
<!-- http://www.itu.int/oth/T02020000D5/en -->
<territory id="TN" countryCode="216" internationalPrefix="00">
<availableFormats>
- <numberFormat pattern="([247-9]\d)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([247-9]\d)(\d{3})(\d{3})">
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[247-9]\d{7}</nationalNumberPattern>
@@ -6280,7 +7204,9 @@
<territory id="TR" countryCode="90" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat pattern="([2-589]\d{2})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([2-589]\d{2})(\d{3})(\d{4})">
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2-589]\d{9}</nationalNumberPattern>
@@ -6345,10 +7271,14 @@
<territory id="TW" countryCode="886" internationalPrefix="0(?:0[25679]|19)"
nationalPrefix="0" preferredExtnPrefix="#" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="[2-7]|8[1-9]"
- pattern="([2-8])(\d{3,4})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="80|9"
- pattern="([89]\d{2})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([2-8])(\d{3,4})(\d{4})">
+ <leadingDigits>[2-7]|8[1-9]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([89]\d{2})(\d{3})(\d{3})">
+ <leadingDigits>80|9</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2-9]\d{7,8}</nationalNumberPattern>
@@ -6381,12 +7311,19 @@
<territory id="TZ" countryCode="255" internationalPrefix="00[056]"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="[24]" pattern="([24]\d)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[67]"
- pattern="([67]\d{2})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([24]\d)(\d{3})(\d{4})">
+ <leadingDigits>[24]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([67]\d{2})(\d{3})(\d{3})">
+ <leadingDigits>[67]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
<!-- Formatting for special numbers from www.tcra.go.tz -->
- <numberFormat leadingDigits="[89]"
- pattern="([89]\d{2})(\d{2})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([89]\d{2})(\d{2})(\d{4})">
+ <leadingDigits>[89]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>\d{9}</nationalNumberPattern>
@@ -6435,14 +7372,20 @@
is useful but not error-free. Have used local yellow pages guidelines,
Google searches and regression tests to reverse-engineer these rules.
-->
- <numberFormat leadingDigits="39|4(?:[45][0-5]|87)|5(?:0|67|7[37])|6[36-8]|9[1-9]"
- pattern="([3-69]\d)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat
- leadingDigits="3(?:[1-46-8]2[013-9]|52)|4[1378]2|5(?:[124-7]2|64)|6(?:[49]2|[12][29]|5[24])|8|90"
- pattern="([3-689]\d{2})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat
- leadingDigits="3(?:5[013-9]|[1-46-8](?:22|[013-9]))|4(?:[137][013-9]|6|[45][6-9]|8[4-6])|5(?:[1245][013-9]|6[0135-9]|3|7[4-6])|6(?:[49][013-9]|5[0135-9]|[12][13-8])"
- pattern="([3-6]\d{3})(\d{5})">$1 $2</numberFormat>
+ <numberFormat pattern="([3-69]\d)(\d{3})(\d{4})">
+ <leadingDigits>39|4(?:[45][0-5]|87)|5(?:0|67|7[37])|6[36-8]|9[1-9]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([3-689]\d{2})(\d{3})(\d{3})">
+ <leadingDigits>3[1-8]2|4[1378]2|5(?:[12457]2|6[24])|6(?:[49]2|[12][29]|5[24])|8|90</leadingDigits>
+ <leadingDigits>3(?:[1-46-8]2[013-9]|52)|4[1378]2|5(?:[12457]2|6[24])|6(?:[49]2|[12][29]|5[24])|8|90</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([3-6]\d{3})(\d{5})">
+ <leadingDigits>3(?:5[013-9]|[1-46-8])|4(?:[137][013-9]|6|[45][6-9]|8[4-6])|5(?:[1245][013-9]|6[0135-9]|3|7[4-6])|6(?:[49][013-9]|5[0135-9]|[12][13-8])</leadingDigits>
+ <leadingDigits>3(?:5[013-9]|[1-46-8](?:22|[013-9]))|4(?:[137][013-9]|6|[45][6-9]|8[4-6])|5(?:[1245][013-9]|6[0135-9]|3|7[4-6])|6(?:[49][013-9]|5[0135-9]|[12][13-8])</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[3-689]\d{8}</nationalNumberPattern>
@@ -6475,11 +7418,18 @@
<territory id="UG" countryCode="256" internationalPrefix="00[057]"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="[7-9]|200|4(?:6[45]|[7-9])"
- pattern="([247-9]\d{2})(\d{6})">$1 $2</numberFormat>
- <numberFormat leadingDigits="3|4(?:[1-5]|6[0-36-9])"
- pattern="([34]\d)(\d{7})">$1 $2</numberFormat>
- <numberFormat leadingDigits="202" pattern="(2024)(\d{5})">$1 $2</numberFormat>
+ <numberFormat pattern="([247-9]\d{2})(\d{6})">
+ <leadingDigits>[7-9]|200|4(?:6[45]|[7-9])</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="([34]\d)(\d{7})">
+ <leadingDigits>3|4(?:[1-5]|6[0-36-9])</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(2024)(\d{5})">
+ <leadingDigits>202</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>\d{9}</nationalNumberPattern>
@@ -6514,15 +7464,24 @@
numbers in the national format, it is not included. Therefore, we omit it here to make
formatting consistent with the rest of the world. The same applies to all the
countries/regions under NANPA -->
+ <!-- The national prefix of "1" here is the same as the country code. It is
+ not used by default when formatting, but is set here so that users
+ who are calling formatByPattern can specify
+ NationalPrefixFormattingRule if they want to. -->
<territory id="US" countryCode="1" internationalPrefix="011"
- mainCountryForCode="true" >
+ mainCountryForCode="true" nationalPrefix="1">
<availableFormats>
- <numberFormat pattern="(\d{3})(\d{3})(\d{4})">($1) $2-$3</numberFormat>
- <numberFormat pattern="(\d{3})(\d{4})">$1-$2</numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <format>($1) $2-$3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{4})">
+ <format>$1-$2</format>
+ </numberFormat>
<!-- A different pattern is used when formatting internationally, as
the area code is no longer optional and should not be in brackets. -->
- <intlNumberFormat pattern="(\d{3})(\d{3})(\d{4})">$1-$2-$3</intlNumberFormat>
- <intlNumberFormat pattern="(\d{3})(\d{4})">$1-$2</intlNumberFormat>
+ <intlNumberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <format>$1-$2-$3</format>
+ </intlNumberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2-9]\d{9}</nationalNumberPattern>
@@ -6558,7 +7517,9 @@
<territory id="UZ" countryCode="998" internationalPrefix="8~10"
nationalPrefix="8" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat pattern="([679]\d)(\d{3})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="([679]\d)(\d{3})(\d{2})(\d{2})">
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[679]\d{8}</nationalNumberPattern>
@@ -6585,7 +7546,9 @@
06 698) but can also be dialled with the Vatican City country code. -->
<territory id="VA" countryCode="379" internationalPrefix="00" >
<availableFormats>
- <numberFormat pattern="(06)(\d{4})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(06)(\d{4})(\d{4})">
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>06\d{8}</nationalNumberPattern>
@@ -6642,7 +7605,9 @@
nationalPrefix="0" nationalPrefixForParsing="1\d{2}|0"
nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat pattern="(\d{3})(\d{7})">$1-$2</numberFormat>
+ <numberFormat pattern="(\d{3})(\d{7})">
+ <format>$1-$2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[24589]\d{9}</nationalNumberPattern>
@@ -6735,21 +7700,39 @@
<territory id="VN" countryCode="84" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="[48]" pattern="([48])(\d{4})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="2[025-79]|3[0136-9]|5[2-9]|6[0-46-9]|7[02-79]"
- pattern="([235-7]\d)(\d{4})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="80"
- pattern="(80)(\d{5})">$1 $2</numberFormat>
- <numberFormat leadingDigits="693"
- pattern="(69[3-5])(\d{5})">$1 $2</numberFormat>
- <numberFormat leadingDigits="2[1348]|3[25]|5[01]|65|7[18]"
- pattern="([235-7]\d{2})(\d{4})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="9"
- pattern="(9[0-8])(\d{3})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
- <numberFormat leadingDigits="1(?:[26]|99)"
- pattern="(1[269]\d)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="1(?:8|90)" nationalPrefixFormattingRule="$FG"
- pattern="(1[89]00)(\d{4,6})">$1 $2</numberFormat>
+ <numberFormat pattern="([48])(\d{4})(\d{4})">
+ <leadingDigits>[48]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="([235-7]\d)(\d{4})(\d{3})">
+ <leadingDigits>2[025-79]|3[0136-9]|5[2-9]|6[0-46-9]|7[02-79]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(80)(\d{5})">
+ <leadingDigits>80</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(69[3-5])(\d{5})">
+ <leadingDigits>693</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="([235-7]\d{2})(\d{4})(\d{3})">
+ <leadingDigits>2[1348]|3[25]|5[01]|65|7[18]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(9[0-8])(\d{3})(\d{2})(\d{2})">
+ <leadingDigits>9</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
+ <numberFormat pattern="(1[269]\d)(\d{3})(\d{4})">
+ <leadingDigits>1(?:[26]|99)</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$FG"
+ pattern="(1[89]00)(\d{4,6})">
+ <leadingDigits>1(?:8|90)</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>8\d{5,8}|[1-79]\d{7,9}</nationalNumberPattern>
@@ -6795,9 +7778,14 @@
<!-- Should be formatted in one block, apart from the specific series
below. For this reason the leadingDigits is more detailed than would
appear necessary. -->
- <numberFormat leadingDigits="840" pattern="(840)(\d{4})">$1 $2</numberFormat>
- <numberFormat leadingDigits="7[25-7]" pattern="(7[25-7])(\d{5})">$1 $2</numberFormat>
- <numberFormat leadingDigits="800" pattern="(800)(\d{3})">$1 $2</numberFormat>
+ <numberFormat pattern="(8[04]0)(\d{3,4})">
+ <leadingDigits>8[04]0</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(7[25-7])(\d{5})">
+ <leadingDigits>7[25-7]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2-8]\d{4,6}</nationalNumberPattern>
@@ -6832,12 +7820,14 @@
<territory id="YE" countryCode="967" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="1[2-68]|[2-6]|7[24-68]"
- pattern="([1-7])(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="17"
- pattern="(1)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="7[137]"
- pattern="(7[137]\d)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([1-7])(\d{3})(\d{3,4})">
+ <leadingDigits>[1-6]|7[24-68]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(7[137]\d)(\d{3})(\d{3})">
+ <leadingDigits>7[137]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-7]\d{6,8}</nationalNumberPattern>
@@ -6892,7 +7882,9 @@
<territory id="ZA" countryCode="27" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat pattern="([1-578]\d)(\d{3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([1-578]\d)(\d{3})(\d{4})">
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>\d{9}</nationalNumberPattern>
@@ -6930,10 +7922,14 @@
<territory id="ZM" countryCode="260" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="[29]"
- pattern="([29]\d)(\d{7})">$1 $2</numberFormat>
- <numberFormat leadingDigits="8"
- pattern="(800)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([29]\d)(\d{7})">
+ <leadingDigits>[29]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(800)(\d{3})(\d{3})">
+ <leadingDigits>8</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[289]\d{8}</nationalNumberPattern>
@@ -6962,30 +7958,44 @@
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
<!-- One-digit area codes -->
- <numberFormat leadingDigits="4|9[2-9]"
- pattern="([49])(\d{3})(\d{2,5})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([49])(\d{3})(\d{2,5})">
+ <leadingDigits>4|9[2-9]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
<!-- Mobile numbers -->
- <numberFormat leadingDigits="[19]1|7"
- pattern="([179]\d)(\d{3})(\d{3,5})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([179]\d)(\d{3})(\d{3,5})">
+ <leadingDigits>[19]1|7</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
<!-- Two-digit area codes -->
- <numberFormat
- leadingDigits="1[3-9]|2(?:[1-469]|0[0-35-9]|[45][0-79])|3(?:0[0-79]|1[0-689]|[24-69]|3[0-69])|5(?:[02-46-9]|[15][0-69])|6(?:[0145]|[29][0-79]|3[0-689]|[68][0-69])"
- pattern="([1-356]\d)(\d{3,5})">$1 $2</numberFormat>
- <numberFormat
- leadingDigits="1[3-9]|2(?:[1-469]|0[0-35-9]|[45][0-79])|3(?:0[0-79]|1[0-689]|[24-69]|3[0-69])|5(?:[02-46-9]|[15][0-69])|6(?:[0145]|[29][0-79]|3[0-689]|[68][0-69])"
- pattern="([1-356]\d)(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([1-356]\d)(\d{3,5})">
+ <leadingDigits>1[3-9]|2(?:[1-469]|0[0-35-9]|[45][0-79])|3(?:0[0-79]|1[0-689]|[24-69]|3[0-69])|5(?:[02-46-9]|[15][0-69])|6(?:[0145]|[29][0-79]|3[0-689]|[68][0-69])</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="([1-356]\d)(\d{3})(\d{3})">
+ <leadingDigits>1[3-9]|2(?:[1-469]|0[0-35-9]|[45][0-79])|3(?:0[0-79]|1[0-689]|[24-69]|3[0-69])|5(?:[02-46-9]|[15][0-69])|6(?:[0145]|[29][0-79]|3[0-689]|[68][0-69])</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
<!-- Three-digit area codes -->
- <numberFormat
- leadingDigits="2(?:[278]|0[45]|48)|3(?:08|17|3[78]|[78])|5[15][78]|6(?:[29]8|37|[68][78])"
- pattern="([2356]\d{2})(\d{3,5})">$1 $2</numberFormat>
- <numberFormat
- leadingDigits="2(?:[278]|0[45]|48)|3(?:08|17|3[78]|[78])|5[15][78]|6(?:[29]8|37|[68][78])"
- pattern="([2356]\d{2})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([2356]\d{2})(\d{3,5})">
+ <leadingDigits>2(?:[278]|0[45]|48)|3(?:08|17|3[78]|[78])|5[15][78]|6(?:[29]8|37|[68][78])</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="([2356]\d{2})(\d{3})(\d{3})">
+ <leadingDigits>2(?:[278]|0[45]|48)|3(?:08|17|3[78]|[78])|5[15][78]|6(?:[29]8|37|[68][78])</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
<!-- Four-digit area codes -->
- <numberFormat leadingDigits="258[23]|5483"
- pattern="([25]\d{3})(\d{3,5})">$1 $2</numberFormat>
- <numberFormat leadingDigits="258[23]|5483"
- pattern="([25]\d{3})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="([25]\d{3})(\d{3,5})">
+ <leadingDigits>(?:25|54)8</leadingDigits>
+ <leadingDigits>258[23]|5483</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="([25]\d{3})(\d{3})(\d{3})">
+ <leadingDigits>(?:25|54)8</leadingDigits>
+ <leadingDigits>258[23]|5483</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>(?:[19]1|23)\d{3,8}|[1-69]\d{4,8}</nationalNumberPattern>
diff --git a/java/resources/com/google/i18n/phonenumbers/test/PhoneNumberMetaDataForTesting.xml b/java/resources/com/google/i18n/phonenumbers/test/PhoneNumberMetaDataForTesting.xml
index e6d11cb4..ea0e0ea1 100644
--- a/java/resources/com/google/i18n/phonenumbers/test/PhoneNumberMetaDataForTesting.xml
+++ b/java/resources/com/google/i18n/phonenumbers/test/PhoneNumberMetaDataForTesting.xml
@@ -26,6 +26,29 @@
<territory id="AD" countryCode="376" internationalPrefix="00">
</territory>
+ <!-- Angola -->
+ <!-- http://www.itu.int/oth/T0202000006/en -->
+ <territory id="AO" countryCode="244" internationalPrefix="00">
+ <availableFormats>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{3})">
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ </availableFormats>
+ <generalDesc>
+ <nationalNumberPattern>[29]\d{8}</nationalNumberPattern>
+ <possibleNumberPattern>\d{9}</possibleNumberPattern>
+ </generalDesc>
+ <fixedLine>
+ <nationalNumberPattern>2\d(?:[26-9]\d|\d[26-9])\d{5}</nationalNumberPattern>
+ <exampleNumber>222123456</exampleNumber>
+ </fixedLine>
+ <mobile>
+ <!-- Expanded the 92 prefix possibilities to matchnumbers found online. -->
+ <nationalNumberPattern>9[1-3]\d{7}</nationalNumberPattern>
+ <exampleNumber>923123456</exampleNumber>
+ </mobile>
+ </territory>
+
<!-- Argentina -->
<territory id="AR" countryCode="54" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG"
@@ -35,16 +58,47 @@
front of carrier selection code 15, is captured to replace $1 in
nationalPrefixTransformRule -->
<availableFormats>
- <numberFormat leadingDigits="11" pattern="(\d{2})(\d{4})(\d{4})">$1 $2-$3</numberFormat>
- <numberFormat leadingDigits="1[02-9]|[23]" pattern="(\d{4})(\d{2})(\d{4})">$1 $2-$3</numberFormat>
- <numberFormat leadingDigits="911" pattern="9(11)(\d{4})(\d{4})">$1 15 $2-$3</numberFormat>
- <numberFormat leadingDigits="9(?:1[02-9]|[23])" pattern="9(\d{4})(\d{2})(\d{4})" carrierCodeFormattingRule="$FG $CC">$1 $2-$3</numberFormat>
- <numberFormat leadingDigits="[68]" pattern="(\d{3})(\d{3})(\d{4})">$1-$2-$3</numberFormat>
- <intlNumberFormat leadingDigits="11" pattern="(\d{2})(\d{4})(\d{4})">$1 $2-$3</intlNumberFormat>
- <intlNumberFormat leadingDigits="1[02-9]|[23]" pattern="(\d{4})(\d{2})(\d{4})">$1 $2-$3</intlNumberFormat>
- <intlNumberFormat leadingDigits="911" pattern="(9)(11)(\d{4})(\d{4})">$1 $2 $3 $4</intlNumberFormat>
- <intlNumberFormat leadingDigits="9(?:1[02-9]|[23])" pattern="(9)(\d{4})(\d{2})(\d{4})">$1 $2 $3 $4</intlNumberFormat>
- <intlNumberFormat leadingDigits="[68]" pattern="(\d{3})(\d{3})(\d{4})">$1-$2-$3</intlNumberFormat>
+ <numberFormat pattern="(\d{2})(\d{4})(\d{4})">
+ <leadingDigits>11</leadingDigits>
+ <format>$1 $2-$3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{4})(\d{2})(\d{4})">
+ <leadingDigits>1[02-9]|[23]</leadingDigits>
+ <format>$1 $2-$3</format>
+ </numberFormat>
+ <numberFormat pattern="9(11)(\d{4})(\d{4})">
+ <leadingDigits>911</leadingDigits>
+ <format>$1 15 $2-$3</format>
+ </numberFormat>
+ <numberFormat pattern="9(\d{4})(\d{2})(\d{4})"
+ carrierCodeFormattingRule="$FG $CC">
+ <leadingDigits>9(?:1[02-9]|[23])</leadingDigits>
+ <format>$1 $2-$3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>[68]</leadingDigits>
+ <format>$1-$2-$3</format>
+ </numberFormat>
+ <intlNumberFormat pattern="(\d{2})(\d{4})(\d{4})">
+ <leadingDigits>11</leadingDigits>
+ <format>$1 $2-$3</format>
+ </intlNumberFormat>
+ <intlNumberFormat pattern="(\d{4})(\d{2})(\d{4})">
+ <leadingDigits>1[02-9]|[23]</leadingDigits>
+ <format>$1 $2-$3</format>
+ </intlNumberFormat>
+ <intlNumberFormat pattern="(9)(11)(\d{4})(\d{4})">
+ <leadingDigits>911</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </intlNumberFormat>
+ <intlNumberFormat pattern="(9)(\d{4})(\d{2})(\d{4})">
+ <leadingDigits>9(?:1[02-9]|[23])</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </intlNumberFormat>
+ <intlNumberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>[68]</leadingDigits>
+ <format>$1-$2-$3</format>
+ </intlNumberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-3689]\d{9,10}</nationalNumberPattern>
@@ -73,8 +127,13 @@
nationalPrefix="0" preferredInternationalPrefix="0011"
nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat nationalPrefixFormattingRule="$FG" leadingDigits="1" pattern="(\d{4})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[2-478]" pattern="(\d{1})(\d{4})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat nationalPrefixFormattingRule="$FG" leadingDigits="1" pattern="(\d{4})(\d{3})(\d{3})">
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{1})(\d{4})(\d{4})">
+ <leadingDigits>[2-478]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc >
<nationalNumberPattern>[1-578]\d{4,14}</nationalNumberPattern>
@@ -100,9 +159,6 @@
<!-- Bahamas -->
<territory id="BS" countryCode="1" internationalPrefix="011">
- <availableFormats>
- <numberFormat pattern="(\d{3})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- </availableFormats>
<generalDesc>
<nationalNumberPattern>(242|8(00|66|77|88)|900)\d{7}</nationalNumberPattern>
<possibleNumberPattern>\d{7,10}</possibleNumberPattern>
@@ -128,12 +184,27 @@
<territory id="DE" countryCode="49" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="2|3[3-9]|906|[4-9][1-9]1" pattern="(\d{3})(\d{3,8})">$1 $2</numberFormat>
- <numberFormat leadingDigits="[34]0|[68]9" pattern="(\d{2})(\d{4,9})">$1 $2</numberFormat>
- <numberFormat leadingDigits="[4-9]" pattern="([4-9]\d{3})(\d{2,7})">$1 $2</numberFormat>
- <numberFormat leadingDigits="800" pattern="(\d{3})(\d{1})(\d{6})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="900[135]" pattern="(\d{3})(\d{3})(d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="9009" pattern="(\d{3})(\d{4})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3,8})">
+ <leadingDigits>2|3[3-9]|906|[4-9][1-9]1</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{4,9})">
+ <leadingDigits>[34]0|[68]9</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="([4-9]\d{3})(\d{2,7})">
+ <leadingDigits>[4-9]</leadingDigits>
+ <leadingDigits>[4-6]|[7-9](?:\d[1-9]|[1-9]\d)</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{1})(\d{6})">
+ <leadingDigits>800</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3,4})(\d{4})">
+ <leadingDigits>900</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>\d{4,14}</nationalNumberPattern>
@@ -161,14 +232,22 @@
<territory id="GB" countryCode="44" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="($NP$FG)">
<availableFormats>
- <numberFormat leadingDigits="[1-59]|[78]0"
- pattern="(\d{2})(\d{4})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="6"
- pattern="(\d)(\d{3})(\d{3})(\d{3})">$1 $2 $3 $4</numberFormat>
- <numberFormat leadingDigits="7[1-57-9]"
- pattern="(\d{4})(\d{3})(\d{3})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="8[47]"
- pattern="(\d{3})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{4})(\d{4})">
+ <leadingDigits>[1-59]|[78]0</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d)(\d{3})(\d{3})(\d{3})">
+ <leadingDigits>6</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{4})(\d{3})(\d{3})">
+ <leadingDigits>7[1-57-9]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>8[47]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>\d{10}</nationalNumberPattern>
@@ -207,10 +286,22 @@
<!-- http://en.wikipedia.org/wiki/%2B39 -->
<territory id="IT" countryCode="39" internationalPrefix="00">
<availableFormats>
- <numberFormat leadingDigits="0[26]" pattern="(\d{2})(\d{4})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="0[13-57-9]" pattern="(\d{3})(\d{4})(\d{3,4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="3" pattern="(\d{3})(\d{3})(\d{3,4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="8" pattern="(\d{3})(\d{3,6})">$1 $2</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{4})(\d{4})">
+ <leadingDigits>0[26]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{4})(\d{3,4})">
+ <leadingDigits>0[13-57-9]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{3,4})">
+ <leadingDigits>3</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3,6})">
+ <leadingDigits>8</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[0389]\d{5,10}</nationalNumberPattern>
@@ -234,6 +325,37 @@
</premiumRate>
</territory>
+ <!-- Japan -->
+ <!-- The metadata here is added to unit test AsYouTypeFormatter for JP, which requires switching
+ patterns as digits beyond the third one are entered. As a result, only a few fake
+ formatting rules are added. -->
+ <territory id="JP" countryCode="81" internationalPrefix="010"
+ nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
+ <availableFormats>
+ <numberFormat pattern="(\d{2})(\d{4})(\d{4})">
+ <leadingDigits>[57-9]0</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{3})(\d{4})">
+ <leadingDigits>222|333</leadingDigits>
+ <leadingDigits>(?:222|333)1</leadingDigits>
+ <leadingDigits>(?:222|333)11</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{4})(\d)(\d{4})">
+ <leadingDigits>222|333</leadingDigits>
+ <leadingDigits>2221|3332</leadingDigits>
+ <leadingDigits>22212|3332</leadingDigits>
+ <leadingDigits>222120|3332</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{2})(\d{4})">
+ <leadingDigits>[23]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ </availableFormats>
+ </territory>
+
<!-- Korea (Rep. of) -->
<!-- http://www.itu.int/oth/T0202000072/en -->
<!-- http://en.wikipedia.org/wiki/%2B82 -->
@@ -249,35 +371,101 @@
nationalPrefix="0" nationalPrefixForParsing="0(?:8[1-46-8]|85\d{2})?"
nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="1(?:0|1[19]|[69]9|5(?:44|59|8))|[57]0"
- pattern="(\d{2})(\d{4})(\d{4})">$1-$2-$3</numberFormat>
- <numberFormat leadingDigits="1(?:[169][2-8]|[78]|5(?:[1-3]|4[56]))|[68]0|[3-9][1-9][2-9]"
- pattern="(\d{2})(\d{3})(\d{4})">$1-$2-$3</numberFormat>
- <numberFormat leadingDigits="1312"
- pattern="(\d{3})(\d)(\d{4})">$1-$2-$3</numberFormat>
- <numberFormat leadingDigits="131[13-9]"
- pattern="(\d{3})(\d{2})(\d{4})">$1-$2-$3</numberFormat>
- <numberFormat leadingDigits="13[2-9]"
- pattern="(\d{3})(\d{3})(\d{4})">$1-$2-$3</numberFormat>
- <numberFormat leadingDigits="30"
- pattern="(\d{2})(\d{2})(\d{3})(\d{4})">$1-$2-$3-$4</numberFormat>
- <numberFormat leadingDigits="2(?:[26]|3(?:01|1[45]|2[17-9]|39|4|6[67]|7[078]))"
- pattern="(\d)(\d{4})(\d{4})">$1-$2-$3</numberFormat>
- <numberFormat leadingDigits="2(?:3(?:0[02-9]|1[0-36-9]|2[02-6]|3[0-8]|6[0-589]|7[1-69]|[589])|[457-9])"
- pattern="(\d)(\d{3})(\d{4})">$1-$2-$3</numberFormat>
- <numberFormat leadingDigits="21(?:[0-247-9]|3[124]|6[1269])"
- pattern="(\d)(\d{3})">$1-$2</numberFormat>
- <numberFormat leadingDigits="21(?:3[035-9]|6[03-578])"
- pattern="(\d)(\d{4})">$1-$2</numberFormat>
- <numberFormat leadingDigits="[3-9][1-9]1(?:[0-247-9]|3[124]|6[1269])"
- pattern="(\d{2})(\d{3})">$1-$2</numberFormat>
- <numberFormat leadingDigits="[3-9][1-9]1(?:3[035-9]|6[03-578])"
- pattern="(\d{2})(\d{4})">$1-$2</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{4})(\d{4})">
+ <leadingDigits>1(?:0|1[19]|[69]9|5[458])|[57]0</leadingDigits>
+ <leadingDigits>1(?:0|1[19]|[69]9|5(?:44|59|8))|[57]0</leadingDigits>
+ <format>$1-$2-$3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{3})(\d{4})">
+ <leadingDigits>1(?:[169][2-8]|[78]|5[1-4])|[68]0|[3-9][1-9][2-9]</leadingDigits>
+ <leadingDigits>1(?:[169][2-8]|[78]|5(?:[1-3]|4[56]))|[68]0|[3-9][1-9][2-9]</leadingDigits>
+ <format>$1-$2-$3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d)(\d{4})">
+ <leadingDigits>131</leadingDigits>
+ <leadingDigits>1312</leadingDigits>
+ <format>$1-$2-$3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{2})(\d{4})">
+ <leadingDigits>131</leadingDigits>
+ <leadingDigits>131[13-9]</leadingDigits>
+ <format>$1-$2-$3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>13[2-9]</leadingDigits>
+ <format>$1-$2-$3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{2})(\d{3})(\d{4})">
+ <leadingDigits>30</leadingDigits>
+ <format>$1-$2-$3-$4</format>
+ </numberFormat>
+ <numberFormat pattern="(\d)(\d{4})(\d{4})">
+ <leadingDigits>2(?:[26]|3[0-467])</leadingDigits>
+ <leadingDigits>2(?:[26]|3(?:01|1[45]|2[17-9]|39|4|6[67]|7[078]))</leadingDigits>
+ <format>$1-$2-$3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d)(\d{3})(\d{4})">
+ <leadingDigits>2(?:3[0-35-9]|[457-9])</leadingDigits>
+ <leadingDigits>2(?:3(?:0[02-9]|1[0-36-9]|2[02-6]|3[0-8]|6[0-589]|7[1-69]|[589])|[457-9])</leadingDigits>
+ <format>$1-$2-$3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d)(\d{3})">
+ <leadingDigits>21[0-46-9]</leadingDigits>
+ <leadingDigits>21(?:[0-247-9]|3[124]|6[1269])</leadingDigits>
+ <format>$1-$2</format>
+ </numberFormat>
+ <numberFormat pattern="(\d)(\d{4})">
+ <leadingDigits>21[36]</leadingDigits>
+ <leadingDigits>21(?:3[035-9]|6[03-578])</leadingDigits>
+ <format>$1-$2</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{3})">
+ <leadingDigits>[3-9][1-9]1</leadingDigits>
+ <leadingDigits>[3-9][1-9]1(?:[0-46-9])</leadingDigits>
+ <leadingDigits>[3-9][1-9]1(?:[0-247-9]|3[124]|6[1269])</leadingDigits>
+ <format>$1-$2</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{4})">
+ <leadingDigits>[3-9][1-9]1</leadingDigits>
+ <leadingDigits>[3-9][1-9]1[36]</leadingDigits>
+ <leadingDigits>[3-9][1-9]1(?:3[035-9]|6[03-578])</leadingDigits>
+ <format>$1-$2</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-79]\d{3,9}|8\d{8}</nationalNumberPattern>
<possibleNumberPattern>\d{4,10}</possibleNumberPattern>
</generalDesc>
+ <fixedLine>
+ <nationalNumberPattern>(?:2|[34][1-3]|5[1-5]|6[1-4])(?:1\d{2,3}|[2-9]\d{6,7})</nationalNumberPattern>
+ <possibleNumberPattern>\d{4,10}</possibleNumberPattern>
+ <exampleNumber>22123456</exampleNumber>
+ </fixedLine>
+ <mobile>
+ <nationalNumberPattern>1[0-25-9]\d{7,8}</nationalNumberPattern>
+ <possibleNumberPattern>\d{9,10}</possibleNumberPattern>
+ <exampleNumber>1023456789</exampleNumber>
+ </mobile>
+ <tollFree>
+ <nationalNumberPattern>80\d{7}</nationalNumberPattern>
+ <possibleNumberPattern>\d{9}</possibleNumberPattern>
+ <exampleNumber>801234567</exampleNumber>
+ </tollFree>
+ <premiumRate>
+ <nationalNumberPattern>60[2-9]\d{6}</nationalNumberPattern>
+ <possibleNumberPattern>\d{9}</possibleNumberPattern>
+ <exampleNumber>602345678</exampleNumber>
+ </premiumRate>
+ <personalNumber>
+ <nationalNumberPattern>50\d{8}</nationalNumberPattern>
+ <possibleNumberPattern>\d{10}</possibleNumberPattern>
+ <exampleNumber>5012345678</exampleNumber>
+ </personalNumber>
+ <voip>
+ <nationalNumberPattern>70\d{8}</nationalNumberPattern>
+ <possibleNumberPattern>\d{10}</possibleNumberPattern>
+ <exampleNumber>7012345678</exampleNumber>
+ </voip>
</territory>
<!-- Mexico -->
@@ -285,16 +473,46 @@
nationalPrefix="01" nationalPrefixForParsing="01|04[45](\d{10})"
nationalPrefixTransformRule="1$1">
<availableFormats>
- <numberFormat leadingDigits="[89]00" pattern="(\d{3})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="33|55|81" pattern="(\d{2})(\d{4})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="[2467]|3[0-24-9]|5[0-46-9]|8[2-9]|9[1-9]" pattern="(\d{3})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="1(?:33|55|81)" pattern="1(\d{2})(\d{4})(\d{4})">045 $1 $2 $3</numberFormat>
- <numberFormat leadingDigits="1(?:[124579]|3[0-24-9]|5[0-46-9]|8[02-9])" pattern="1(\d{3})(\d{3})(\d{4})">045 $1 $2 $3</numberFormat>
- <intlNumberFormat leadingDigits="[89]00" pattern="(\d{3})(\d{3})(\d{4})">$1 $2 $3</intlNumberFormat>
- <intlNumberFormat leadingDigits="33|55|81" pattern="(\d{2})(\d{4})(\d{4})">$1 $2 $3</intlNumberFormat>
- <intlNumberFormat leadingDigits="[2467]|3[0-24-9]|5[0-46-9]|8[2-9]|9[1-9]" pattern="(\d{3})(\d{3})(\d{4})">$1 $2 $3</intlNumberFormat>
- <intlNumberFormat leadingDigits="1(?:33|55|81)" pattern="(1)(\d{2})(\d{4})(\d{4})">$1 $2 $3 $4</intlNumberFormat>
- <intlNumberFormat leadingDigits="1(?:[124579]|3[0-24-9]|5[0-46-9]|8[02-9])" pattern="(1)(\d{3})(\d{3})(\d{4})">$1 $2 $3 $4</intlNumberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>[89]00</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{2})(\d{4})(\d{4})">
+ <leadingDigits>33|55|81</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>[2467]|3[0-24-9]|5[0-46-9]|8[2-9]|9[1-9]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="1(\d{2})(\d{4})(\d{4})">
+ <leadingDigits>1(?:33|55|81)</leadingDigits>
+ <format>045 $1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="1(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>1(?:[124579]|3[0-24-9]|5[0-46-9]|8[02-9])</leadingDigits>
+ <format>045 $1 $2 $3</format>
+ </numberFormat>
+ <intlNumberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>[89]00</leadingDigits>
+ <format>$1 $2 $3</format>
+ </intlNumberFormat>
+ <intlNumberFormat pattern="(\d{2})(\d{4})(\d{4})">
+ <leadingDigits>33|55|81</leadingDigits>
+ <format>$1 $2 $3</format>
+ </intlNumberFormat>
+ <intlNumberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>[2467]|3[0-24-9]|5[0-46-9]|8[2-9]|9[1-9]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </intlNumberFormat>
+ <intlNumberFormat pattern="(1)(\d{2})(\d{4})(\d{4})">
+ <leadingDigits>1(?:33|55|81)</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </intlNumberFormat>
+ <intlNumberFormat pattern="(1)(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>1(?:[124579]|3[0-24-9]|5[0-46-9]|8[02-9])</leadingDigits>
+ <format>$1 $2 $3 $4</format>
+ </intlNumberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-9]\d{9,10}</nationalNumberPattern>
@@ -322,9 +540,18 @@
<territory id="NZ" countryCode="64" internationalPrefix="00"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat leadingDigits="24|[34679]" pattern="(\d)(\d{3})(\d{4})">$1-$2 $3</numberFormat>
- <numberFormat leadingDigits="2[179]" pattern="(\d)(\d{3})(\d{3,5})">$1-$2 $3</numberFormat>
- <numberFormat leadingDigits="[89]" pattern="(\d{3})(\d{3})(\d{3,4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(\d)(\d{3})(\d{4})">
+ <leadingDigits>24|[34679]</leadingDigits>
+ <format>$1-$2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d)(\d{3})(\d{3,5})">
+ <leadingDigits>2[179]</leadingDigits>
+ <format>$1-$2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{3,4})">
+ <leadingDigits>[89]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[2-9]\d{7,9}</nationalNumberPattern>
@@ -353,7 +580,9 @@
<territory id="PL" countryCode="48" internationalPrefix="0~0"
nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat pattern="(\d{2})(\d{3})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="(\d{2})(\d{3})(\d{2})(\d{2})">
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[1-9]\d{8}</nationalNumberPattern>
@@ -377,7 +606,9 @@
<territory id="RE" countryCode="262" leadingDigits="262|6(?:9[23]|47)|8"
internationalPrefix="00" nationalPrefix="0" nationalPrefixFormattingRule="$NP$FG">
<availableFormats>
- <numberFormat pattern="([268]\d{2})(\d{2})(\d{2})(\d{2})">$1 $2 $3 $4</numberFormat>
+ <numberFormat pattern="([268]\d{2})(\d{2})(\d{2})(\d{2})">
+ <format>$1 $2 $3 $4</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[268]\d{8}</nationalNumberPattern>
@@ -409,9 +640,18 @@
<!-- http://www.ida.gov.sg/policies%20and%20regulation/20060508120124.aspx -->
<territory id="SG" countryCode="65" internationalPrefix="0[0-3][0-9]">
<availableFormats>
- <numberFormat leadingDigits="[369]|8[1-9]" pattern="(\d{4})(\d{4})">$1 $2</numberFormat>
- <numberFormat leadingDigits="1[89]" pattern="(\d{4})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat leadingDigits="800" pattern="(\d{3})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
+ <numberFormat pattern="(\d{4})(\d{4})">
+ <leadingDigits>[369]|8[1-9]</leadingDigits>
+ <format>$1 $2</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{4})(\d{3})(\d{4})">
+ <leadingDigits>1[89]</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <leadingDigits>800</leadingDigits>
+ <format>$1 $2 $3</format>
+ </numberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[13689]\d{7,10}</nationalNumberPattern>
@@ -440,11 +680,18 @@
<!-- For testing purposes, numbers starting with 24 are not considered US
numbers.-->
<territory id="US" countryCode="1" internationalPrefix="011"
- preferredExtnPrefix=" extn. "
- mainCountryForCode="true">
+ preferredExtnPrefix=" extn. " nationalPrefix="1"
+ mainCountryForCode="true" >
<availableFormats>
- <numberFormat pattern="(\d{3})(\d{3})(\d{4})">$1 $2 $3</numberFormat>
- <numberFormat pattern="(\d{3})(\d{4})">$1 $2</numberFormat>
+ <numberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <format>$1 $2 $3</format>
+ </numberFormat>
+ <numberFormat pattern="(\d{3})(\d{4})">
+ <format>$1 $2</format>
+ </numberFormat>
+ <intlNumberFormat pattern="(\d{3})(\d{3})(\d{4})">
+ <format>$1 $2 $3</format>
+ </intlNumberFormat>
</availableFormats>
<generalDesc>
<nationalNumberPattern>[13-9]\d{9}|2[0-35-9]\d{8}</nationalNumberPattern>
diff --git a/java/src/com/google/i18n/phonenumbers/AsYouTypeFormatter.java b/java/src/com/google/i18n/phonenumbers/AsYouTypeFormatter.java
index 303a4744..5fd91703 100644
--- a/java/src/com/google/i18n/phonenumbers/AsYouTypeFormatter.java
+++ b/java/src/com/google/i18n/phonenumbers/AsYouTypeFormatter.java
@@ -20,6 +20,7 @@ import com.google.i18n.phonenumbers.Phonemetadata.NumberFormat;
import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -38,15 +39,18 @@ import java.util.regex.Pattern;
* @author Shaopeng Jia
*/
public class AsYouTypeFormatter {
- private StringBuffer currentOutput;
- private String formattingTemplate;
- private StringBuffer accruedInput;
- private StringBuffer accruedInputWithoutFormatting;
+ private String currentOutput = "";
+ private StringBuffer formattingTemplate = new StringBuffer();
+ // The pattern from numberFormat that is currently used to create formattingTemplate.
+ private String currentFormattingPattern = "";
+ private StringBuffer accruedInput = new StringBuffer();
+ private StringBuffer accruedInputWithoutFormatting = new StringBuffer();
private boolean ableToFormat = true;
private boolean isInternationalFormatting = false;
+ private boolean isExpectingCountryCode = false;
private final PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
private String defaultCountry;
- private Phonemetadata.PhoneMetadata defaultMetaData;
+ private PhoneMetadata defaultMetaData;
private PhoneMetadata currentMetaData;
// A pattern that is used to match character classes in regular expressions. An example of a
@@ -59,21 +63,30 @@ public class AsYouTypeFormatter {
// the phone number can be as long as 15 digits.
private static final Pattern STANDALONE_DIGIT_PATTERN = Pattern.compile("\\d(?=[^,}][^,}])");
+ // This is the minimum length of national number accrued that is required to trigger the
+ // formatter. The first element of the leadingDigitsPattern of each numberFormat contains a
+ // regular expression that matches up to this number of digits.
+ private static final int MIN_LEADING_DIGITS_LENGTH = 3;
+
// The digits that have not been entered yet will be represented by a \u2008, the punctuation
// space.
private String digitPlaceholder = "\u2008";
private Pattern digitPattern = Pattern.compile(digitPlaceholder);
private int lastMatchPosition = 0;
// The position of a digit upon which inputDigitAndRememberPosition is most recently invoked, as
- // found in the current output.
- private int positionRemembered = 0;
- // The position of a digit upon which inputDigitAndRememberPosition is most recently invoked, as
// found in the original sequence of characters the user entered.
private int originalPosition = 0;
+ // The position of a digit upon which inputDigitAndRememberPosition is most recently invoked, as
+ // found in accruedInputWithoutFormatting.
+ private int positionToRemember = 0;
private Pattern nationalPrefixForParsing;
private Pattern internationalPrefix;
- private StringBuffer prefixBeforeNationalNumber;
- private StringBuffer nationalNumber;
+ private StringBuffer prefixBeforeNationalNumber = new StringBuffer();
+ private StringBuffer nationalNumber = new StringBuffer();
+ private List<NumberFormat> possibleFormats = new ArrayList<NumberFormat>();
+
+ // A cache for frequently used country-specific regular expressions.
+ private RegexCache regexCache = new RegexCache(64);
/**
* Constructs a light-weight formatter which does no formatting, but outputs exactly what is
@@ -82,11 +95,6 @@ public class AsYouTypeFormatter {
* @param regionCode the country/region where the phone number is being entered
*/
AsYouTypeFormatter(String regionCode) {
- accruedInput = new StringBuffer();
- accruedInputWithoutFormatting = new StringBuffer();
- currentOutput = new StringBuffer();
- prefixBeforeNationalNumber = new StringBuffer();
- nationalNumber = new StringBuffer();
defaultCountry = regionCode;
initializeCountrySpecificInfo(defaultCountry);
defaultMetaData = currentMetaData;
@@ -95,44 +103,55 @@ public class AsYouTypeFormatter {
private void initializeCountrySpecificInfo(String regionCode) {
currentMetaData = phoneUtil.getMetadataForRegion(regionCode);
nationalPrefixForParsing =
- Pattern.compile(currentMetaData.getNationalPrefixForParsing());
+ regexCache.getPatternForRegex(currentMetaData.getNationalPrefixForParsing());
internationalPrefix =
- Pattern.compile("\\+|" + currentMetaData.getInternationalPrefix());
+ regexCache.getPatternForRegex("\\+|" + currentMetaData.getInternationalPrefix());
}
- private void chooseFormatAndCreateTemplate(String leadingFourDigitsOfNationalNumber) {
- List<NumberFormat> formatList = getAvailableFormats(leadingFourDigitsOfNationalNumber);
- if (formatList.size() < 1) {
- ableToFormat = false;
- } else {
- // When there are multiple available formats, the formatter uses the first format.
- NumberFormat format = formatList.get(0);
- if (!createFormattingTemplate(format)) {
- ableToFormat = false;
- } else {
- currentOutput = new StringBuffer(formattingTemplate);
+ // Returns true if a new template is created as opposed to reusing the existing template.
+ private boolean maybeCreateNewTemplate() {
+ // When there are multiple available formats, the formatter uses the first format where a
+ // formatting template could be created.
+ for (NumberFormat numberFormat : possibleFormats) {
+ String pattern = numberFormat.getPattern();
+ if (currentFormattingPattern.equals(pattern)) {
+ return false;
+ }
+ if (createFormattingTemplate(numberFormat)) {
+ currentFormattingPattern = pattern;
+ return true;
}
}
+ ableToFormat = false;
+ return false;
}
- private List<NumberFormat> getAvailableFormats(String leadingFourDigits) {
- List<NumberFormat> matchedList = new ArrayList<NumberFormat>();
+ private void getAvailableFormats(String leadingThreeDigits) {
List<NumberFormat> formatList =
(isInternationalFormatting && currentMetaData.getIntlNumberFormatCount() > 0)
? currentMetaData.getIntlNumberFormatList()
: currentMetaData.getNumberFormatList();
- for (NumberFormat format : formatList) {
- if (format.hasLeadingDigits()) {
- Pattern leadingDigitsPattern = Pattern.compile(format.getLeadingDigits());
- Matcher m = leadingDigitsPattern.matcher(leadingFourDigits);
- if (m.lookingAt()) {
- matchedList.add(format);
+ possibleFormats.addAll(formatList);
+ narrowDownPossibleFormats(leadingThreeDigits);
+ }
+
+ private void narrowDownPossibleFormats(String leadingDigits) {
+ int lengthOfLeadingDigits = leadingDigits.length();
+ int indexOfLeadingDigitsPattern = lengthOfLeadingDigits - MIN_LEADING_DIGITS_LENGTH;
+ Iterator<NumberFormat> it = possibleFormats.iterator();
+ while (it.hasNext()) {
+ NumberFormat format = it.next();
+ if (format.getLeadingDigitsPatternCount() > indexOfLeadingDigitsPattern) {
+ Pattern leadingDigitsPattern =
+ regexCache.getPatternForRegex(
+ format.getLeadingDigitsPattern(indexOfLeadingDigitsPattern));
+ Matcher m = leadingDigitsPattern.matcher(leadingDigits);
+ if (!m.lookingAt()) {
+ it.remove();
}
- } else {
- matchedList.add(format);
- }
+ } // else the particular format has no more specific leadingDigitsPattern, and it should be
+ // retained.
}
- return matchedList;
}
private boolean createFormattingTemplate(NumberFormat format) {
@@ -150,8 +169,8 @@ public class AsYouTypeFormatter {
// Replace any standalone digit (not the one in d{}) with \d
numberPattern = STANDALONE_DIGIT_PATTERN.matcher(numberPattern).replaceAll("\\\\d");
-
- formattingTemplate = getFormattingTemplate(numberPattern, numberFormat);
+ formattingTemplate.setLength(0);
+ formattingTemplate.append(getFormattingTemplate(numberPattern, numberFormat));
return true;
}
@@ -161,7 +180,7 @@ public class AsYouTypeFormatter {
// Creates a phone number consisting only of the digit 9 that matches the
// numberPattern by applying the pattern to the longestPhoneNumber string.
String longestPhoneNumber = "999999999999999";
- Matcher m = Pattern.compile(numberPattern).matcher(longestPhoneNumber);
+ Matcher m = regexCache.getPatternForRegex(numberPattern).matcher(longestPhoneNumber);
m.find(); // this will always succeed
String aPhoneNumber = m.group();
// Formats the number according to numberFormat
@@ -175,23 +194,36 @@ public class AsYouTypeFormatter {
* Clears the internal state of the formatter, so it could be reused.
*/
public void clear() {
+ currentOutput = "";
accruedInput.setLength(0);
accruedInputWithoutFormatting.setLength(0);
- currentOutput.setLength(0);
+ formattingTemplate.setLength(0);
lastMatchPosition = 0;
+ currentFormattingPattern = "";
prefixBeforeNationalNumber.setLength(0);
nationalNumber.setLength(0);
ableToFormat = true;
- positionRemembered = 0;
+ positionToRemember = 0;
originalPosition = 0;
isInternationalFormatting = false;
+ isExpectingCountryCode = false;
+ possibleFormats.clear();
if (!currentMetaData.equals(defaultMetaData)) {
initializeCountrySpecificInfo(defaultCountry);
}
}
+ /**
+ * Formats a phone number on-the-fly as each digit is entered.
+ *
+ * @param nextChar the most recently entered digit of a phone number. Formatting characters are
+ * allowed, but they are removed from the result. Full width digits and Arabic-indic digits
+ * are allowed, and will be shown as they are.
+ * @return the partially formatted phone number.
+ */
public String inputDigit(char nextChar) {
- return inputDigitWithOptionToRememberPosition(nextChar, false);
+ currentOutput = inputDigitWithOptionToRememberPosition(nextChar, false);
+ return currentOutput;
}
/**
@@ -200,14 +232,15 @@ public class AsYouTypeFormatter {
* adjusted if additional formatting characters are later inserted/removed in front of nextChar.
*/
public String inputDigitAndRememberPosition(char nextChar) {
- return inputDigitWithOptionToRememberPosition(nextChar, true);
+ currentOutput = inputDigitWithOptionToRememberPosition(nextChar, true);
+ return currentOutput;
}
+ @SuppressWarnings(value = "fallthrough")
private String inputDigitWithOptionToRememberPosition(char nextChar, boolean rememberPosition) {
accruedInput.append(nextChar);
if (rememberPosition) {
- positionRemembered = accruedInput.length();
- originalPosition = positionRemembered;
+ originalPosition = accruedInput.length();
}
// We do formatting on-the-fly only when each character entered is either a plus sign or a
// digit.
@@ -215,46 +248,71 @@ public class AsYouTypeFormatter {
ableToFormat = false;
}
if (!ableToFormat) {
- resetPositionOnFailureToFormat();
return accruedInput.toString();
}
- nextChar = normalizeAndAccrueDigitsAndPlusSign(nextChar);
+ nextChar = normalizeAndAccrueDigitsAndPlusSign(nextChar, rememberPosition);
- // We start to attempt to format only when at least 6 digits (the plus sign is counted as a
- // digit as well for this purpose) have been entered.
+ // We start to attempt to format only when at least MIN_LEADING_DIGITS_LENGTH digits (the plus
+ // sign is counted as a digit as well for this purpose) have been entered.
switch (accruedInputWithoutFormatting.length()) {
case 0: // this is the case where the first few inputs are neither digits nor the plus sign.
case 1:
case 2:
+ return accruedInput.toString();
case 3:
+ if (attemptToExtractIdd()) {
+ isExpectingCountryCode = true;
+ } else { // No IDD or plus sign is found, must be entering in national format.
+ removeNationalPrefixFromNationalNumber();
+ return attemptToChooseFormattingPattern();
+ }
case 4:
case 5:
- return accruedInput.toString();
+ if (isExpectingCountryCode) {
+ if (attemptToExtractCountryCode()) {
+ isExpectingCountryCode = false;
+ }
+ return prefixBeforeNationalNumber + nationalNumber.toString();
+ }
+ // We make a last attempt to extract a country code at the 6th digit because the maximum
+ // length of IDD and country code are both 3.
case 6:
- if (!extractIddAndValidCountryCode()) {
+ if (isExpectingCountryCode && !attemptToExtractCountryCode()) {
ableToFormat = false;
return accruedInput.toString();
}
- removeNationalPrefixFromNationalNumber();
- return attemptToChooseFormattingPattern(rememberPosition);
default:
- if (nationalNumber.length() > 4) { // The formatting pattern is already chosen.
- String temp = inputDigitHelper(nextChar, rememberPosition);
+ if (possibleFormats.size() > 0) { // The formatting pattern is already chosen.
+ String tempNationalNumber = inputDigitHelper(nextChar);
+ // See if the accrued digits can be formatted properly already. If not, use the results
+ // from inputDigitHelper, which does formatting based on the formatting pattern chosen.
+ String formattedNumber = attemptToFormatAccruedDigits();
+ if (formattedNumber.length() > 0) {
+ return formattedNumber;
+ }
+ narrowDownPossibleFormats(nationalNumber.toString());
+ if (maybeCreateNewTemplate()) {
+ return inputAccruedNationalNumber();
+ }
return ableToFormat
- ? prefixBeforeNationalNumber + temp
- : temp;
+ ? prefixBeforeNationalNumber + tempNationalNumber
+ : tempNationalNumber;
} else {
- return attemptToChooseFormattingPattern(rememberPosition);
+ return attemptToChooseFormattingPattern();
}
}
}
- private void resetPositionOnFailureToFormat() {
- if (positionRemembered > 0) {
- positionRemembered = originalPosition;
- currentOutput.setLength(0);
+ String attemptToFormatAccruedDigits() {
+ for (NumberFormat numFormat : possibleFormats) {
+ Matcher m = regexCache.getPatternForRegex(numFormat.getPattern()).matcher(nationalNumber);
+ if (m.matches()) {
+ String formattedNumber = m.replaceAll(numFormat.getFormat());
+ return prefixBeforeNationalNumber + formattedNumber;
+ }
}
+ return "";
}
/**
@@ -262,48 +320,49 @@ public class AsYouTypeFormatter {
* previously passed in as the parameter of inputDigitAndRememberPosition().
*/
public int getRememberedPosition() {
- return positionRemembered;
+ if (!ableToFormat) {
+ return originalPosition;
+ }
+ int accruedInputIndex = 0, currentOutputIndex = 0;
+ while (accruedInputIndex < positionToRemember) {
+ if (accruedInputWithoutFormatting.charAt(accruedInputIndex) ==
+ currentOutput.charAt(currentOutputIndex)) {
+ accruedInputIndex++;
+ currentOutputIndex++;
+ } else {
+ currentOutputIndex++;
+ }
+ }
+ return currentOutputIndex;
}
// Attempts to set the formatting template and returns a string which contains the formatted
// version of the digits entered so far.
- private String attemptToChooseFormattingPattern(boolean rememberPosition) {
- // We start to attempt to format only when as least 4 digits of national number (excluding
- // national prefix) have been entered.
- if (nationalNumber.length() >= 4) {
- chooseFormatAndCreateTemplate(nationalNumber.substring(0, 4));
- return inputAccruedNationalNumber(rememberPosition);
+ private String attemptToChooseFormattingPattern() {
+ // We start to attempt to format only when as least MIN_LEADING_DIGITS_LENGTH digits of national
+ // number (excluding national prefix) have been entered.
+ if (nationalNumber.length() >= MIN_LEADING_DIGITS_LENGTH) {
+ getAvailableFormats(nationalNumber.substring(0, MIN_LEADING_DIGITS_LENGTH));
+ maybeCreateNewTemplate();
+ return inputAccruedNationalNumber();
} else {
- if (rememberPosition) {
- positionRemembered = prefixBeforeNationalNumber.length() + nationalNumber.length();
- }
return prefixBeforeNationalNumber + nationalNumber.toString();
}
}
// Invokes inputDigitHelper on each digit of the national number accrued, and returns a formatted
// string in the end.
- private String inputAccruedNationalNumber(boolean rememberPosition) {
+ private String inputAccruedNationalNumber() {
int lengthOfNationalNumber = nationalNumber.length();
if (lengthOfNationalNumber > 0) {
- // The positionRemembered should be only adjusted once in the loop that follows.
- boolean positionAlreadyAdjusted = false;
String tempNationalNumber = "";
for (int i = 0; i < lengthOfNationalNumber; i++) {
- tempNationalNumber = inputDigitHelper(nationalNumber.charAt(i), rememberPosition);
- if (!positionAlreadyAdjusted &&
- positionRemembered - prefixBeforeNationalNumber.length() == i + 1) {
- positionRemembered = prefixBeforeNationalNumber.length() + tempNationalNumber.length();
- positionAlreadyAdjusted = true;
- }
+ tempNationalNumber = inputDigitHelper(nationalNumber.charAt(i));
}
return ableToFormat
? prefixBeforeNationalNumber + tempNationalNumber
: tempNationalNumber;
} else {
- if (rememberPosition) {
- positionRemembered = prefixBeforeNationalNumber.length();
- }
return prefixBeforeNationalNumber.toString();
}
}
@@ -313,11 +372,7 @@ public class AsYouTypeFormatter {
if (currentMetaData.getCountryCode() == 1 && nationalNumber.charAt(0) == '1') {
startOfNationalNumber = 1;
prefixBeforeNationalNumber.append("1 ");
- // Since a space is inserted after the national prefix in this case, we increase the
- // remembered position by 1 for anything that is after the national prefix.
- if (positionRemembered > prefixBeforeNationalNumber.length() - 1) {
- positionRemembered++;
- }
+ isInternationalFormatting = true;
} else if (currentMetaData.hasNationalPrefix()) {
Matcher m = nationalPrefixForParsing.matcher(nationalNumber);
if (m.lookingAt()) {
@@ -329,51 +384,53 @@ public class AsYouTypeFormatter {
}
/**
- * Extracts IDD, plus sign and country code to prefixBeforeNationalNumber when they are available,
- * and places the remaining input into nationalNumber.
+ * Extracts IDD and plus sign to prefixBeforeNationalNumber when they are available, and places
+ * the remaining input into nationalNumber.
*
- * @return false when accruedInputWithoutFormatting begins with the plus sign or valid IDD for
- * defaultCountry, but the sequence of digits after that does not form a valid country code.
- * It returns true for all other cases.
+ * @return true when accruedInputWithoutFormatting begins with the plus sign or valid IDD for
+ * defaultCountry.
*/
- private boolean extractIddAndValidCountryCode() {
- nationalNumber.setLength(0);
+ private boolean attemptToExtractIdd() {
Matcher iddMatcher = internationalPrefix.matcher(accruedInputWithoutFormatting);
if (iddMatcher.lookingAt()) {
isInternationalFormatting = true;
int startOfCountryCode = iddMatcher.end();
- StringBuffer numberIncludeCountryCode =
- new StringBuffer(accruedInputWithoutFormatting.substring(startOfCountryCode));
- int countryCode = phoneUtil.extractCountryCode(numberIncludeCountryCode, nationalNumber);
+ nationalNumber.setLength(0);
+ nationalNumber.append(accruedInputWithoutFormatting.substring(startOfCountryCode));
+ prefixBeforeNationalNumber.append(
+ accruedInputWithoutFormatting.substring(0, startOfCountryCode));
+ if (accruedInputWithoutFormatting.charAt(0) != PhoneNumberUtil.PLUS_SIGN) {
+ prefixBeforeNationalNumber.append(" ");
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Extracts country code from the beginning of nationalNumber to prefixBeforeNationalNumber when
+ * they are available, and places the remaining input into nationalNumber.
+ *
+ * @return true when a valid country code can be found.
+ */
+ private boolean attemptToExtractCountryCode() {
+ if (nationalNumber.length() == 0) {
+ return false;
+ }
+ StringBuffer numberWithoutCountryCode = new StringBuffer();
+ int countryCode = phoneUtil.extractCountryCode(nationalNumber, numberWithoutCountryCode);
if (countryCode == 0) {
return false;
} else {
+ nationalNumber.setLength(0);
+ nationalNumber.append(numberWithoutCountryCode);
String newRegionCode = phoneUtil.getRegionCodeForCountryCode(countryCode);
if (!newRegionCode.equals(defaultCountry)) {
initializeCountrySpecificInfo(newRegionCode);
}
- prefixBeforeNationalNumber.append(
- accruedInputWithoutFormatting.substring(0, startOfCountryCode));
- if (accruedInputWithoutFormatting.charAt(0) != PhoneNumberUtil.PLUS_SIGN ) {
- if (positionRemembered > prefixBeforeNationalNumber.length()) {
- // Since a space will be inserted in front of the country code in this case, we increase
- // the remembered position by 1.
- positionRemembered++;
- }
- prefixBeforeNationalNumber.append(" ");
- }
String countryCodeString = Integer.toString(countryCode);
- if (positionRemembered > prefixBeforeNationalNumber.length() + countryCodeString.length()) {
- // Since a space will be inserted after the country code in this case, we increase the
- // remembered position by 1.
- positionRemembered++;
- }
prefixBeforeNationalNumber.append(countryCodeString).append(" ");
}
- } else {
- nationalNumber.setLength(0);
- nationalNumber.append(accruedInputWithoutFormatting);
- }
return true;
}
@@ -381,36 +438,30 @@ public class AsYouTypeFormatter {
// contains a digit in non-ASCII format (e.g. the full-width version of digits), it is first
// normalized to the ASCII version. The return value is nextChar itself, or its normalized
// version, if nextChar is a digit in non-ASCII format.
- private char normalizeAndAccrueDigitsAndPlusSign(char nextChar) {
+ private char normalizeAndAccrueDigitsAndPlusSign(char nextChar, boolean rememberPosition) {
if (nextChar == PhoneNumberUtil.PLUS_SIGN) {
accruedInputWithoutFormatting.append(nextChar);
}
-
if (PhoneNumberUtil.DIGIT_MAPPINGS.containsKey(nextChar)) {
nextChar = PhoneNumberUtil.DIGIT_MAPPINGS.get(nextChar);
accruedInputWithoutFormatting.append(nextChar);
nationalNumber.append(nextChar);
}
+ if (rememberPosition) {
+ positionToRemember = accruedInputWithoutFormatting.length();
+ }
return nextChar;
}
- private String inputDigitHelper(char nextChar, boolean rememberPosition) {
- if (!PhoneNumberUtil.DIGIT_MAPPINGS.containsKey(nextChar)) {
- return currentOutput.toString();
- }
-
- Matcher digitMatcher = digitPattern.matcher(currentOutput);
+ private String inputDigitHelper(char nextChar) {
+ Matcher digitMatcher = digitPattern.matcher(formattingTemplate);
if (digitMatcher.find(lastMatchPosition)) {
- currentOutput = new StringBuffer(digitMatcher.replaceFirst(Character.toString(nextChar)));
+ String tempTemplate = digitMatcher.replaceFirst(Character.toString(nextChar));
+ formattingTemplate.replace(0, tempTemplate.length(), tempTemplate);
lastMatchPosition = digitMatcher.start();
- if (rememberPosition) {
- positionRemembered = prefixBeforeNationalNumber.length() + lastMatchPosition + 1;
- }
- return currentOutput.substring(0, lastMatchPosition + 1);
+ return formattingTemplate.substring(0, lastMatchPosition + 1);
} else { // More digits are entered than we could handle.
- currentOutput.append(nextChar);
ableToFormat = false;
- resetPositionOnFailureToFormat();
return accruedInput.toString();
}
}
diff --git a/java/src/com/google/i18n/phonenumbers/PhoneNumberMetadataProto b/java/src/com/google/i18n/phonenumbers/PhoneNumberMetadataProto
index c2906bc2..56a2e1f4 100644
--- a/java/src/com/google/i18n/phonenumbers/PhoneNumberMetadataProto
+++ b/java/src/com/google/i18n/phonenumbers/PhoneNumberMetadataProto
Binary files differ
diff --git a/java/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java b/java/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java
index 080a65a3..4f91588c 100644
--- a/java/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java
+++ b/java/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java
@@ -498,7 +498,7 @@ public class PhoneNumberUtil {
* subscriber number should be diallable, at least on some devices. An example of how this could
* be used:
*
- * PhoneNumberUtil phoneUtil.PhoneNumberUtil.getInstance();
+ * PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
* PhoneNumber number = phoneUtil.parse("16502530000", RegionCode.US);
* String nationalSignificantNumber = PhoneNumberUtil.getNationalSignificantNumber(number);
* String areaCode;
@@ -540,7 +540,7 @@ public class PhoneNumberUtil {
return 0;
}
- PhoneNumberType type = getNumberTypeHelper(String.valueOf(number.getNationalNumber()),
+ PhoneNumberType type = getNumberTypeHelper(getNationalSignificantNumber(number),
metadata);
// Most numbers other than the two types below have to be dialled in full.
if (type != PhoneNumberType.FIXED_LINE && type != PhoneNumberType.FIXED_LINE_OR_MOBILE) {
@@ -567,11 +567,8 @@ public class PhoneNumberUtil {
if (numberGroups.length <= 3) {
return 0;
}
- // Note all countries that use leading zero in national number don't use national prefix, so
- // they won't have an area code, which means clients don't need to worry about appending the
- // leading zero to the geographical area code they derive from the length we return here.
return numberGroups[2].length();
- }
+ }
/**
* Normalizes a string of characters representing a phone number by replacing all characters found
@@ -725,24 +722,40 @@ public Set<String> getSupportedCountries() {
if (!isValidRegionCode(regionCode)) {
return nationalSignificantNumber;
}
+ List<NumberFormat> userDefinedFormatsCopy =
+ new ArrayList<NumberFormat>(userDefinedFormats.size());
int size = userDefinedFormats.size();
for (int i = 0; i < size; i++) {
NumberFormat numFormat = userDefinedFormats.get(i);
String nationalPrefixFormattingRule = numFormat.getNationalPrefixFormattingRule();
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.
+ NumberFormat numFormatCopy = new NumberFormat();
+ numFormatCopy.mergeFrom(numFormat);
String nationalPrefix = getMetadataForRegion(regionCode).getNationalPrefix();
- // Replace $NP with national prefix and $FG with the first group ($1).
- nationalPrefixFormattingRule =
- NP_PATTERN.matcher(nationalPrefixFormattingRule).replaceFirst(nationalPrefix);
- nationalPrefixFormattingRule =
- FG_PATTERN.matcher(nationalPrefixFormattingRule).replaceFirst("\\$1");
- numFormat.setNationalPrefixFormattingRule(nationalPrefixFormattingRule);
+ if (nationalPrefix.length() > 0) {
+ // Replace $NP with national prefix and $FG with the first group ($1).
+ nationalPrefixFormattingRule =
+ NP_PATTERN.matcher(nationalPrefixFormattingRule).replaceFirst(nationalPrefix);
+ nationalPrefixFormattingRule =
+ FG_PATTERN.matcher(nationalPrefixFormattingRule).replaceFirst("\\$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);
+ } else {
+ // Otherwise, we just add the original rule to the modified list of formats.
+ userDefinedFormatsCopy.add(numFormat);
}
}
StringBuffer formattedNumber =
new StringBuffer(formatAccordingToFormats(nationalSignificantNumber,
- userDefinedFormats,
+ userDefinedFormatsCopy,
numberFormat));
maybeGetFormattedExtension(number, regionCode, formattedNumber);
formatNumberByFormat(countryCode, numberFormat, formattedNumber);
@@ -808,7 +821,7 @@ public Set<String> getSupportedCountries() {
} else if (countryCode == getCountryCodeForRegion(countryCallingFrom)) {
// For countries that share a country calling code, the country code need not be dialled. This
// also applies when dialling within a country, so this if clause covers both these cases.
- // Technically this is the case for dialling from la RŽunion to other overseas departments of
+ // Technically this is the case for dialling from la Reunion to other overseas departments of
// France (French Guiana, Martinique, Guadeloupe), but not vice versa - so we don't cover this
// edge case for now and for those cases return the version including country code.
// Details here: http://www.petitfute.com/voyage/225-info-pratiques-reunion
@@ -866,11 +879,11 @@ public Set<String> getSupportedCountries() {
return format(number, PhoneNumberFormat.INTERNATIONAL).substring(1);
case FROM_DEFAULT_COUNTRY:
default:
- return format(number, PhoneNumberFormat.NATIONAL);
+ return format(number, PhoneNumberFormat.NATIONAL);
}
}
-
+
/**
* Gets the national significant number of the a phone number. Note a national significant number
* doesn't contain a national prefix or any formatting.
@@ -918,7 +931,7 @@ public Set<String> getSupportedCountries() {
String regionCode,
PhoneNumberFormat numberFormat) {
return formatNationalNumber(number, regionCode, numberFormat, null);
- }
+ }
// Note in some countries, the national number can be written in two completely different ways
// depending on whether it forms part of the NATIONAL format or INTERNATIONAL format. The
@@ -953,9 +966,10 @@ public Set<String> getSupportedCountries() {
PhoneNumberFormat numberFormat,
String carrierCode) {
for (NumberFormat numFormat : availableFormats) {
- if (!numFormat.hasLeadingDigits() ||
- regexCache.getPatternForRegex(numFormat.getLeadingDigits()).matcher(nationalNumber)
- .lookingAt()) {
+ int size = numFormat.getLeadingDigitsPatternCount();
+ if (size == 0 || regexCache.getPatternForRegex(
+ // We always use the last leading_digits_pattern, as it is the most detailed.
+ numFormat.getLeadingDigitsPattern(size - 1)).matcher(nationalNumber).lookingAt()) {
Matcher m = regexCache.getPatternForRegex(numFormat.getPattern()).matcher(nationalNumber);
String numberFormatRule = numFormat.getFormat();
if (m.matches()) {
@@ -1373,6 +1387,32 @@ public Set<String> getSupportedCountries() {
}
/**
+ * Attempts to extract a valid number from a phone number that is too long to be valid, and resets
+ * the PhoneNumber object passed in to that valid version. If no valid number could be extracted,
+ * the PhoneNumber object passed in will not be modified.
+ * @param number a PhoneNumber object which contains a number that is too long to be valid.
+ * @return true if a valid phone number can be successfully extracted.
+ */
+ public boolean truncateTooLongNumber(PhoneNumber number) {
+ if (isValidNumber(number)) {
+ return true;
+ }
+ PhoneNumber numberCopy = new PhoneNumber();
+ numberCopy.mergeFrom(number);
+ long nationalNumber = number.getNationalNumber();
+ do {
+ nationalNumber /= 10;
+ numberCopy.setNationalNumber(nationalNumber);
+ if (isPossibleNumberWithReason(numberCopy) == ValidationResult.TOO_SHORT ||
+ nationalNumber == 0) {
+ return false;
+ }
+ } while (!isValidNumber(numberCopy));
+ number.setNationalNumber(nationalNumber);
+ return true;
+ }
+
+ /**
* Gets an AsYouTypeFormatter for the specific country. Note this function doesn't attempt to
* figure out the types of phone number being entered on the fly due to performance reasons.
* Instead, it tries to apply a standard format to all types of phone numbers. For countries
@@ -1396,7 +1436,8 @@ public Set<String> getSupportedCountries() {
// 0 if fullNumber doesn't start with a valid country code, and leaves nationalNumber unmodified.
int extractCountryCode(StringBuffer fullNumber, StringBuffer nationalNumber) {
int potentialCountryCode;
- for (int i = 1; i <= 3; i++) {
+ int numberLength = fullNumber.length();
+ for (int i = 1; i <= 3 && i <= numberLength; i++) {
potentialCountryCode = Integer.parseInt(fullNumber.substring(0, i));
if (countryCodeToRegionCodeMap.containsKey(potentialCountryCode)) {
nationalNumber.append(fullNumber.substring(i));
@@ -1472,9 +1513,9 @@ public Set<String> getSupportedCountries() {
} else if (defaultRegionMetadata != null) {
// Check to see if the number is valid for the default region already. If not, we check to
// see if the country code for the default region is present at the start of the number.
+ PhoneNumberDesc generalDesc = defaultRegionMetadata.getGeneralDesc();
Pattern validNumberPattern =
- regexCache.getPatternForRegex(defaultRegionMetadata.getGeneralDesc()
- .getNationalNumberPattern());
+ regexCache.getPatternForRegex(generalDesc.getNationalNumberPattern());
if (!validNumberPattern.matcher(fullNumber).matches()) {
int defaultCountryCode = defaultRegionMetadata.getCountryCode();
String defaultCountryCodeString = String.valueOf(defaultCountryCode);
@@ -1488,7 +1529,14 @@ public Set<String> getSupportedCountries() {
defaultRegionMetadata.getNationalPrefixForParsing(),
defaultRegionMetadata.getNationalPrefixTransformRule(),
validNumberPattern);
- if (validNumberPattern.matcher(potentialNationalNumber).matches()) {
+ Matcher possibleNumberMatcher =
+ regexCache.getPatternForRegex(generalDesc.getPossibleNumberPattern()).matcher(
+ potentialNationalNumber);
+ // If the resultant number is either valid, or still too long even with the country code
+ // stripped, we consider this a better result and keep the potential national number.
+ if (validNumberPattern.matcher(potentialNationalNumber).matches() ||
+ (possibleNumberMatcher.lookingAt() &&
+ possibleNumberMatcher.end() != potentialNationalNumber.length())) {
nationalNumber.append(potentialNationalNumber);
if (storeCountryCodeSource) {
phoneNumber.setCountryCodeSource(CountryCodeSource.FROM_NUMBER_WITHOUT_PLUS_SIGN);
diff --git a/java/src/com/google/i18n/phonenumbers/Phonemetadata.java b/java/src/com/google/i18n/phonenumbers/Phonemetadata.java
index 09022bb2..a6a91d87 100644
--- a/java/src/com/google/i18n/phonenumbers/Phonemetadata.java
+++ b/java/src/com/google/i18n/phonenumbers/Phonemetadata.java
@@ -55,14 +55,20 @@ public final class Phonemetadata {
return this;
}
- // optional string leading_digits = 3;
- private boolean hasLeadingDigits;
- private String leadingDigits_ = "";
- public boolean hasLeadingDigits() { return hasLeadingDigits; }
- public String getLeadingDigits() { return leadingDigits_; }
- public NumberFormat setLeadingDigits(String value) {
- hasLeadingDigits = true;
- leadingDigits_ = value;
+ // repeated string leading_digits_pattern = 3;
+ private java.util.List<String> leadingDigitsPattern_ = new java.util.ArrayList<String>();
+ public java.util.List<String> getLeadingDigitsPatternList() {
+ return leadingDigitsPattern_;
+ }
+ public int getLeadingDigitsPatternCount() { return leadingDigitsPattern_.size(); }
+ public String getLeadingDigitsPattern(int index) {
+ return leadingDigitsPattern_.get(index);
+ }
+ public NumberFormat addLeadingDigitsPattern(String value) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ leadingDigitsPattern_.add(value);
return this;
}
@@ -76,6 +82,11 @@ public final class Phonemetadata {
nationalPrefixFormattingRule_ = value;
return this;
}
+ public NumberFormat clearNationalPrefixFormattingRule() {
+ hasNationalPrefixFormattingRule = false;
+ nationalPrefixFormattingRule_ = "";
+ return this;
+ }
// optional string domestic_carrier_code_formatting_rule = 5;
private boolean hasDomesticCarrierCodeFormattingRule;
@@ -90,13 +101,35 @@ public final class Phonemetadata {
return this;
}
+ public NumberFormat mergeFrom(NumberFormat other) {
+ if (other.hasPattern()) {
+ setPattern(other.getPattern());
+ }
+ if (other.hasFormat()) {
+ setFormat(other.getFormat());
+ }
+ int leadingDigitsPatternSize = other.getLeadingDigitsPatternCount();
+ for (int i = 0; i < leadingDigitsPatternSize; i++) {
+ addLeadingDigitsPattern(other.getLeadingDigitsPattern(i));
+ }
+ if (other.hasNationalPrefixFormattingRule()) {
+ setNationalPrefixFormattingRule(other.getNationalPrefixFormattingRule());
+ }
+ if (other.hasDomesticCarrierCodeFormattingRule()) {
+ setDomesticCarrierCodeFormattingRule(other.getDomesticCarrierCodeFormattingRule());
+ }
+ return this;
+ }
+
public void writeExternal(ObjectOutput objectOutput) throws IOException {
objectOutput.writeUTF(pattern_);
objectOutput.writeUTF(format_);
- objectOutput.writeBoolean(hasLeadingDigits);
- if (hasLeadingDigits) {
- objectOutput.writeUTF(leadingDigits_);
+ int leadingDigitsPatternSize = getLeadingDigitsPatternCount();
+ objectOutput.writeInt(leadingDigitsPatternSize);
+ for (int i = 0; i < leadingDigitsPatternSize; i++) {
+ objectOutput.writeUTF(leadingDigitsPattern_.get(i));
}
+
objectOutput.writeBoolean(hasNationalPrefixFormattingRule);
if (hasNationalPrefixFormattingRule) {
objectOutput.writeUTF(nationalPrefixFormattingRule_);
@@ -110,8 +143,9 @@ public final class Phonemetadata {
public void readExternal(ObjectInput objectInput) throws IOException, ClassNotFoundException {
setPattern(objectInput.readUTF());
setFormat(objectInput.readUTF());
- if (objectInput.readBoolean()) {
- setLeadingDigits(objectInput.readUTF());
+ int leadingDigitsPatternSize = objectInput.readInt();
+ for (int i = 0; i < leadingDigitsPatternSize; i++) {
+ leadingDigitsPattern_.add(objectInput.readUTF());
}
if (objectInput.readBoolean()) {
setNationalPrefixFormattingRule(objectInput.readUTF());
diff --git a/java/test/com/google/i18n/phonenumbers/AsYouTypeFormatterTest.java b/java/test/com/google/i18n/phonenumbers/AsYouTypeFormatterTest.java
index 9b294077..a6155286 100644
--- a/java/test/com/google/i18n/phonenumbers/AsYouTypeFormatterTest.java
+++ b/java/test/com/google/i18n/phonenumbers/AsYouTypeFormatterTest.java
@@ -40,15 +40,16 @@ public class AsYouTypeFormatterTest extends TestCase {
phoneUtil = PhoneNumberUtil.getInstance(in);
}
- public void testAsYouTypeFormatterUS() {
+ public void testAYTFUS() {
AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("US");
assertEquals("6", formatter.inputDigit('6'));
assertEquals("65", formatter.inputDigit('5'));
assertEquals("650", formatter.inputDigit('0'));
- assertEquals("6502", formatter.inputDigit('2'));
- assertEquals("65025", formatter.inputDigit('5'));
+ assertEquals("650 2", formatter.inputDigit('2'));
+ assertEquals("650 25", formatter.inputDigit('5'));
assertEquals("650 253", formatter.inputDigit('3'));
- assertEquals("650 253 2", formatter.inputDigit('2'));
+ // Note this is how a US local number (without area code) should be formatted.
+ assertEquals("650 2532", formatter.inputDigit('2'));
assertEquals("650 253 22", formatter.inputDigit('2'));
assertEquals("650 253 222", formatter.inputDigit('2'));
assertEquals("650 253 2222", formatter.inputDigit('2'));
@@ -56,9 +57,9 @@ public class AsYouTypeFormatterTest extends TestCase {
formatter.clear();
assertEquals("1", formatter.inputDigit('1'));
assertEquals("16", formatter.inputDigit('6'));
- assertEquals("165", formatter.inputDigit('5'));
- assertEquals("1650", formatter.inputDigit('0'));
- assertEquals("16502", formatter.inputDigit('2'));
+ assertEquals("1 65", formatter.inputDigit('5'));
+ assertEquals("1 650", formatter.inputDigit('0'));
+ assertEquals("1 650 2", formatter.inputDigit('2'));
assertEquals("1 650 25", formatter.inputDigit('5'));
assertEquals("1 650 253", formatter.inputDigit('3'));
assertEquals("1 650 253 2", formatter.inputDigit('2'));
@@ -69,12 +70,12 @@ public class AsYouTypeFormatterTest extends TestCase {
formatter.clear();
assertEquals("0", formatter.inputDigit('0'));
assertEquals("01", formatter.inputDigit('1'));
- assertEquals("011", formatter.inputDigit('1'));
- assertEquals("0114", formatter.inputDigit('4'));
- assertEquals("01144", formatter.inputDigit('4'));
+ assertEquals("011 ", formatter.inputDigit('1'));
+ assertEquals("011 4", formatter.inputDigit('4'));
+ assertEquals("011 44 ", formatter.inputDigit('4'));
assertEquals("011 44 6", formatter.inputDigit('6'));
assertEquals("011 44 61", formatter.inputDigit('1'));
- assertEquals("011 44 612", formatter.inputDigit('2'));
+ assertEquals("011 44 6 12", formatter.inputDigit('2'));
assertEquals("011 44 6 123", formatter.inputDigit('3'));
assertEquals("011 44 6 123 1", formatter.inputDigit('1'));
assertEquals("011 44 6 123 12", formatter.inputDigit('2'));
@@ -86,14 +87,13 @@ public class AsYouTypeFormatterTest extends TestCase {
formatter.clear();
assertEquals("0", formatter.inputDigit('0'));
assertEquals("01", formatter.inputDigit('1'));
- assertEquals("011", formatter.inputDigit('1'));
- assertEquals("0115", formatter.inputDigit('5'));
- assertEquals("01154", formatter.inputDigit('4'));
+ assertEquals("011 ", formatter.inputDigit('1'));
+ assertEquals("011 5", formatter.inputDigit('5'));
+ assertEquals("011 54 ", formatter.inputDigit('4'));
assertEquals("011 54 9", formatter.inputDigit('9'));
assertEquals("011 54 91", formatter.inputDigit('1'));
- assertEquals("011 54 911", formatter.inputDigit('1'));
- assertEquals("011 54 9 11 2",
- formatter.inputDigit('2'));
+ assertEquals("011 54 9 11", formatter.inputDigit('1'));
+ assertEquals("011 54 9 11 2", formatter.inputDigit('2'));
assertEquals("011 54 9 11 23", formatter.inputDigit('3'));
assertEquals("011 54 9 11 231", formatter.inputDigit('1'));
assertEquals("011 54 9 11 2312", formatter.inputDigit('2'));
@@ -103,12 +103,29 @@ public class AsYouTypeFormatterTest extends TestCase {
assertEquals("011 54 9 11 2312 1234", formatter.inputDigit('4'));
formatter.clear();
+ assertEquals("0", formatter.inputDigit('0'));
+ assertEquals("01", formatter.inputDigit('1'));
+ assertEquals("011 ", formatter.inputDigit('1'));
+ assertEquals("011 2", formatter.inputDigit('2'));
+ assertEquals("011 24", formatter.inputDigit('4'));
+ assertEquals("011 244 ", formatter.inputDigit('4'));
+ assertEquals("011 244 2", formatter.inputDigit('2'));
+ assertEquals("011 244 28", formatter.inputDigit('8'));
+ assertEquals("011 244 280", formatter.inputDigit('0'));
+ assertEquals("011 244 280 0", formatter.inputDigit('0'));
+ assertEquals("011 244 280 00", formatter.inputDigit('0'));
+ assertEquals("011 244 280 000", formatter.inputDigit('0'));
+ assertEquals("011 244 280 000 0", formatter.inputDigit('0'));
+ assertEquals("011 244 280 000 00", formatter.inputDigit('0'));
+ assertEquals("011 244 280 000 000", formatter.inputDigit('0'));
+
+ formatter.clear();
assertEquals("+", formatter.inputDigit('+'));
assertEquals("+4", formatter.inputDigit('4'));
- assertEquals("+48", formatter.inputDigit('8'));
- assertEquals("+488", formatter.inputDigit('8'));
- assertEquals("+4888", formatter.inputDigit('8'));
- assertEquals("+48 881", formatter.inputDigit('1'));
+ assertEquals("+48 ", formatter.inputDigit('8'));
+ assertEquals("+48 8", formatter.inputDigit('8'));
+ assertEquals("+48 88", formatter.inputDigit('8'));
+ assertEquals("+48 88 1", formatter.inputDigit('1'));
assertEquals("+48 88 12", formatter.inputDigit('2'));
assertEquals("+48 88 123", formatter.inputDigit('3'));
assertEquals("+48 88 123 1", formatter.inputDigit('1'));
@@ -117,21 +134,21 @@ public class AsYouTypeFormatterTest extends TestCase {
assertEquals("+48 88 123 12 12", formatter.inputDigit('2'));
}
- public void testAsYouTypeFormatterUSFullWidthCharacters() {
+ public void testAYTFUSFullWidthCharacters() {
AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("US");
assertEquals("\uFF16", formatter.inputDigit('\uFF16'));
assertEquals("\uFF16\uFF15", formatter.inputDigit('\uFF15'));
- assertEquals("\uFF16\uFF15\uFF10", formatter.inputDigit('\uFF10'));
- assertEquals("\uFF16\uFF15\uFF10\uFF12", formatter.inputDigit('\uFF12'));
- assertEquals("\uFF16\uFF15\uFF10\uFF12\uFF15", formatter.inputDigit('\uFF15'));
+ assertEquals("650", formatter.inputDigit('\uFF10'));
+ assertEquals("650 2", formatter.inputDigit('\uFF12'));
+ assertEquals("650 25", formatter.inputDigit('\uFF15'));
assertEquals("650 253", formatter.inputDigit('\uFF13'));
- assertEquals("650 253 2", formatter.inputDigit('\uFF12'));
+ assertEquals("650 2532", formatter.inputDigit('\uFF12'));
assertEquals("650 253 22", formatter.inputDigit('\uFF12'));
assertEquals("650 253 222", formatter.inputDigit('\uFF12'));
assertEquals("650 253 2222", formatter.inputDigit('\uFF12'));
}
- public void testAsYouTypeFormatterUSMobileShortCode() {
+ public void testAYTFUSMobileShortCode() {
AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("US");
assertEquals("*", formatter.inputDigit('*'));
assertEquals("*1", formatter.inputDigit('1'));
@@ -140,7 +157,7 @@ public class AsYouTypeFormatterTest extends TestCase {
assertEquals("*121#", formatter.inputDigit('#'));
}
- public void testAsYouTypeFormatterUSVanityNumber() {
+ public void testAYTFUSVanityNumber() {
AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("US");
assertEquals("8", formatter.inputDigit('8'));
assertEquals("80", formatter.inputDigit('0'));
@@ -156,16 +173,16 @@ public class AsYouTypeFormatterTest extends TestCase {
assertEquals("800 MY APPLE", formatter.inputDigit('E'));
}
- public void testAsYouTypeFormatterAndRememberPositionUS() {
+ public void testAYTFAndRememberPositionUS() {
AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("US");
assertEquals("1", formatter.inputDigitAndRememberPosition('1'));
assertEquals(1, formatter.getRememberedPosition());
assertEquals("16", formatter.inputDigit('6'));
- assertEquals("165", formatter.inputDigit('5'));
+ assertEquals("1 65", formatter.inputDigit('5'));
assertEquals(1, formatter.getRememberedPosition());
- assertEquals("1650", formatter.inputDigitAndRememberPosition('0'));
- assertEquals(4, formatter.getRememberedPosition());
- assertEquals("16502", formatter.inputDigit('2'));
+ assertEquals("1 650", formatter.inputDigitAndRememberPosition('0'));
+ assertEquals(5, formatter.getRememberedPosition());
+ assertEquals("1 650 2", formatter.inputDigit('2'));
assertEquals("1 650 25", formatter.inputDigit('5'));
// Note the remembered position for digit "0" changes from 4 to 5, because a space is now
// inserted in the front.
@@ -185,39 +202,40 @@ public class AsYouTypeFormatterTest extends TestCase {
formatter.clear();
assertEquals("1", formatter.inputDigit('1'));
- assertEquals("16", formatter.inputDigit('6'));
- assertEquals("165", formatter.inputDigitAndRememberPosition('5'));
- assertEquals("1650", formatter.inputDigit('0'));
+ assertEquals("16", formatter.inputDigitAndRememberPosition('6'));
+ assertEquals(2, formatter.getRememberedPosition());
+ assertEquals("1 65", formatter.inputDigit('5'));
+ assertEquals("1 650", formatter.inputDigit('0'));
assertEquals(3, formatter.getRememberedPosition());
- assertEquals("16502", formatter.inputDigit('2'));
+ assertEquals("1 650 2", formatter.inputDigit('2'));
assertEquals("1 650 25", formatter.inputDigit('5'));
- assertEquals(4, formatter.getRememberedPosition());
+ assertEquals(3, formatter.getRememberedPosition());
assertEquals("1 650 253", formatter.inputDigit('3'));
assertEquals("1 650 253 2", formatter.inputDigit('2'));
assertEquals("1 650 253 22", formatter.inputDigit('2'));
- assertEquals(4, formatter.getRememberedPosition());
+ assertEquals(3, formatter.getRememberedPosition());
assertEquals("1 650 253 222", formatter.inputDigit('2'));
assertEquals("1 650 253 2222", formatter.inputDigit('2'));
assertEquals("165025322222", formatter.inputDigit('2'));
- assertEquals(3, formatter.getRememberedPosition());
+ assertEquals(2, formatter.getRememberedPosition());
assertEquals("1650253222222", formatter.inputDigit('2'));
- assertEquals(3, formatter.getRememberedPosition());
+ assertEquals(2, formatter.getRememberedPosition());
formatter.clear();
assertEquals("6", formatter.inputDigit('6'));
assertEquals("65", formatter.inputDigit('5'));
assertEquals("650", formatter.inputDigit('0'));
- assertEquals("6502", formatter.inputDigit('2'));
- assertEquals("65025", formatter.inputDigitAndRememberPosition('5'));
- assertEquals(5, formatter.getRememberedPosition());
+ assertEquals("650 2", formatter.inputDigit('2'));
+ assertEquals("650 25", formatter.inputDigit('5'));
assertEquals("650 253", formatter.inputDigit('3'));
- assertEquals(6, formatter.getRememberedPosition());
- assertEquals("650 253 2", formatter.inputDigit('2'));
+ assertEquals("650 2532", formatter.inputDigitAndRememberPosition('2'));
+ assertEquals(8, formatter.getRememberedPosition());
assertEquals("650 253 22", formatter.inputDigit('2'));
+ assertEquals(9, formatter.getRememberedPosition());
assertEquals("650 253 222", formatter.inputDigit('2'));
// No more formatting when semicolon is entered.
assertEquals("650253222;", formatter.inputDigit(';'));
- assertEquals(5, formatter.getRememberedPosition());
+ assertEquals(7, formatter.getRememberedPosition());
assertEquals("650253222;2", formatter.inputDigit('2'));
formatter.clear();
@@ -241,14 +259,14 @@ public class AsYouTypeFormatterTest extends TestCase {
formatter.clear();
assertEquals("0", formatter.inputDigit('0'));
assertEquals("01", formatter.inputDigit('1'));
- assertEquals("011", formatter.inputDigit('1'));
- assertEquals("0114", formatter.inputDigitAndRememberPosition('4'));
- assertEquals("01148", formatter.inputDigit('8'));
- assertEquals(4, formatter.getRememberedPosition());
+ assertEquals("011 ", formatter.inputDigit('1'));
+ assertEquals("011 4", formatter.inputDigitAndRememberPosition('4'));
+ assertEquals("011 48 ", formatter.inputDigit('8'));
+ assertEquals(5, formatter.getRememberedPosition());
assertEquals("011 48 8", formatter.inputDigit('8'));
assertEquals(5, formatter.getRememberedPosition());
assertEquals("011 48 88", formatter.inputDigit('8'));
- assertEquals("011 48 881", formatter.inputDigit('1'));
+ assertEquals("011 48 88 1", formatter.inputDigit('1'));
assertEquals("011 48 88 12", formatter.inputDigit('2'));
assertEquals(5, formatter.getRememberedPosition());
assertEquals("011 48 88 123", formatter.inputDigit('3'));
@@ -260,10 +278,10 @@ public class AsYouTypeFormatterTest extends TestCase {
formatter.clear();
assertEquals("+", formatter.inputDigit('+'));
assertEquals("+1", formatter.inputDigit('1'));
- assertEquals("+16", formatter.inputDigitAndRememberPosition('6'));
- assertEquals("+165", formatter.inputDigit('5'));
- assertEquals("+1650", formatter.inputDigit('0'));
- assertEquals(3, formatter.getRememberedPosition());
+ assertEquals("+1 6", formatter.inputDigitAndRememberPosition('6'));
+ assertEquals("+1 65", formatter.inputDigit('5'));
+ assertEquals("+1 650", formatter.inputDigit('0'));
+ assertEquals(4, formatter.getRememberedPosition());
assertEquals("+1 650 2", formatter.inputDigit('2'));
assertEquals(4, formatter.getRememberedPosition());
assertEquals("+1 650 25", formatter.inputDigit('5'));
@@ -276,10 +294,10 @@ public class AsYouTypeFormatterTest extends TestCase {
formatter.clear();
assertEquals("+", formatter.inputDigit('+'));
assertEquals("+1", formatter.inputDigit('1'));
- assertEquals("+16", formatter.inputDigitAndRememberPosition('6'));
- assertEquals("+165", formatter.inputDigit('5'));
- assertEquals("+1650", formatter.inputDigit('0'));
- assertEquals(3, formatter.getRememberedPosition());
+ assertEquals("+1 6", formatter.inputDigitAndRememberPosition('6'));
+ assertEquals("+1 65", formatter.inputDigit('5'));
+ assertEquals("+1 650", formatter.inputDigit('0'));
+ assertEquals(4, formatter.getRememberedPosition());
assertEquals("+1 650 2", formatter.inputDigit('2'));
assertEquals(4, formatter.getRememberedPosition());
assertEquals("+1 650 25", formatter.inputDigit('5'));
@@ -291,14 +309,14 @@ public class AsYouTypeFormatterTest extends TestCase {
assertEquals(3, formatter.getRememberedPosition());
}
- public void testAsYouTypeFormatterGBFixedLine() {
+ public void testAYTFGBFixedLine() {
AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("GB");
assertEquals("0", formatter.inputDigit('0'));
assertEquals("02", formatter.inputDigit('2'));
assertEquals("020", formatter.inputDigit('0'));
- assertEquals("0207", formatter.inputDigitAndRememberPosition('7'));
- assertEquals(4, formatter.getRememberedPosition());
- assertEquals("02070", formatter.inputDigit('0'));
+ assertEquals("020 7", formatter.inputDigitAndRememberPosition('7'));
+ assertEquals(5, formatter.getRememberedPosition());
+ assertEquals("020 70", formatter.inputDigit('0'));
assertEquals("020 703", formatter.inputDigit('3'));
assertEquals(5, formatter.getRememberedPosition());
assertEquals("020 7031", formatter.inputDigit('1'));
@@ -308,13 +326,13 @@ public class AsYouTypeFormatterTest extends TestCase {
assertEquals("020 7031 3000", formatter.inputDigit('0'));
}
- public void testAsYouTypeFormatterGBTollFree() {
+ public void testAYTFGBTollFree() {
AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("gb");
assertEquals("0", formatter.inputDigit('0'));
assertEquals("08", formatter.inputDigit('8'));
assertEquals("080", formatter.inputDigit('0'));
- assertEquals("0807", formatter.inputDigit('7'));
- assertEquals("08070", formatter.inputDigit('0'));
+ assertEquals("080 7", formatter.inputDigit('7'));
+ assertEquals("080 70", formatter.inputDigit('0'));
assertEquals("080 703", formatter.inputDigit('3'));
assertEquals("080 7031", formatter.inputDigit('1'));
assertEquals("080 7031 3", formatter.inputDigit('3'));
@@ -323,13 +341,13 @@ public class AsYouTypeFormatterTest extends TestCase {
assertEquals("080 7031 3000", formatter.inputDigit('0'));
}
- public void testAsYouTypeFormatterGBPremiumRate() {
+ public void testAYTFGBPremiumRate() {
AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("GB");
assertEquals("0", formatter.inputDigit('0'));
assertEquals("09", formatter.inputDigit('9'));
assertEquals("090", formatter.inputDigit('0'));
- assertEquals("0907", formatter.inputDigit('7'));
- assertEquals("09070", formatter.inputDigit('0'));
+ assertEquals("090 7", formatter.inputDigit('7'));
+ assertEquals("090 70", formatter.inputDigit('0'));
assertEquals("090 703", formatter.inputDigit('3'));
assertEquals("090 7031", formatter.inputDigit('1'));
assertEquals("090 7031 3", formatter.inputDigit('3'));
@@ -338,13 +356,13 @@ public class AsYouTypeFormatterTest extends TestCase {
assertEquals("090 7031 3000", formatter.inputDigit('0'));
}
- public void testAsYouTypeFormatterNZMobile() {
+ public void testAYTFNZMobile() {
AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("NZ");
assertEquals("0", formatter.inputDigit('0'));
assertEquals("02", formatter.inputDigit('2'));
assertEquals("021", formatter.inputDigit('1'));
- assertEquals("0211", formatter.inputDigit('1'));
- assertEquals("02112", formatter.inputDigit('2'));
+ assertEquals("02-11", formatter.inputDigit('1'));
+ assertEquals("02-112", formatter.inputDigit('2'));
// Note the unittest is using fake metadata which might produce non-ideal results.
assertEquals("02-112 3", formatter.inputDigit('3'));
assertEquals("02-112 34", formatter.inputDigit('4'));
@@ -352,24 +370,52 @@ public class AsYouTypeFormatterTest extends TestCase {
assertEquals("02-112 3456", formatter.inputDigit('6'));
}
- public void testAsYouTypeFormatterDE() {
+ public void testAYTFDE() {
AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("DE");
assertEquals("0", formatter.inputDigit('0'));
assertEquals("03", formatter.inputDigit('3'));
assertEquals("030", formatter.inputDigit('0'));
- assertEquals("0301", formatter.inputDigit('1'));
- assertEquals("03012", formatter.inputDigit('2'));
+ assertEquals("030 1", formatter.inputDigit('1'));
+ assertEquals("030 12", formatter.inputDigit('2'));
assertEquals("030 123", formatter.inputDigit('3'));
assertEquals("030 1234", formatter.inputDigit('4'));
+
+ // 08021 2345
+ formatter.clear();
+ assertEquals("0", formatter.inputDigit('0'));
+ assertEquals("08", formatter.inputDigit('8'));
+ assertEquals("080", formatter.inputDigit('0'));
+ assertEquals("0802", formatter.inputDigit('2'));
+ assertEquals("08021", formatter.inputDigit('1'));
+ assertEquals("08021 2", formatter.inputDigit('2'));
+ assertEquals("08021 23", formatter.inputDigit('3'));
+ assertEquals("08021 234", formatter.inputDigit('4'));
+ assertEquals("08021 2345", formatter.inputDigit('5'));
+
+ // 00 1 650 253 2250
+ formatter.clear();
+ assertEquals("0", formatter.inputDigit('0'));
+ assertEquals("00", formatter.inputDigit('0'));
+ assertEquals("00 1 ", formatter.inputDigit('1'));
+ assertEquals("00 1 6", formatter.inputDigit('6'));
+ assertEquals("00 1 65", formatter.inputDigit('5'));
+ assertEquals("00 1 650", formatter.inputDigit('0'));
+ assertEquals("00 1 650 2", formatter.inputDigit('2'));
+ assertEquals("00 1 650 25", formatter.inputDigit('5'));
+ assertEquals("00 1 650 253", formatter.inputDigit('3'));
+ assertEquals("00 1 650 253 2", formatter.inputDigit('2'));
+ assertEquals("00 1 650 253 22", formatter.inputDigit('2'));
+ assertEquals("00 1 650 253 222", formatter.inputDigit('2'));
+ assertEquals("00 1 650 253 2222", formatter.inputDigit('2'));
}
- public void testAsYouTypeFormatterAR() {
+ public void testAYTFAR() {
AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("AR");
assertEquals("0", formatter.inputDigit('0'));
assertEquals("01", formatter.inputDigit('1'));
assertEquals("011", formatter.inputDigit('1'));
- assertEquals("0117", formatter.inputDigit('7'));
- assertEquals("01170", formatter.inputDigit('0'));
+ assertEquals("011 7", formatter.inputDigit('7'));
+ assertEquals("011 70", formatter.inputDigit('0'));
assertEquals("011 703", formatter.inputDigit('3'));
assertEquals("011 7031", formatter.inputDigit('1'));
assertEquals("011 7031-3", formatter.inputDigit('3'));
@@ -378,15 +424,16 @@ public class AsYouTypeFormatterTest extends TestCase {
assertEquals("011 7031-3000", formatter.inputDigit('0'));
}
- public void testAsYouTypeFormatterARMobile() {
+ public void testAYTFARMobile() {
AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("AR");
assertEquals("+", formatter.inputDigit('+'));
assertEquals("+5", formatter.inputDigit('5'));
- assertEquals("+54", formatter.inputDigit('4'));
- assertEquals("+549", formatter.inputDigit('9'));
- assertEquals("+5491", formatter.inputDigit('1'));
- assertEquals("+54 911", formatter.inputDigit('1'));
- assertEquals("+54 9 11 2", formatter.inputDigit('2'));
+ assertEquals("+54 ", formatter.inputDigit('4'));
+ assertEquals("+54 9", formatter.inputDigit('9'));
+ assertEquals("+54 91", formatter.inputDigit('1'));
+ assertEquals("+54 9 11", formatter.inputDigit('1'));
+ assertEquals("+54 9 11 2",
+ formatter.inputDigit('2'));
assertEquals("+54 9 11 23", formatter.inputDigit('3'));
assertEquals("+54 9 11 231", formatter.inputDigit('1'));
assertEquals("+54 9 11 2312", formatter.inputDigit('2'));
@@ -396,15 +443,15 @@ public class AsYouTypeFormatterTest extends TestCase {
assertEquals("+54 9 11 2312 1234", formatter.inputDigit('4'));
}
- public void testAsYouTypeFormatterKR() {
+ public void testAYTFKR() {
// +82 51 234 5678
AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("KR");
assertEquals("+", formatter.inputDigit('+'));
assertEquals("+8", formatter.inputDigit('8'));
- assertEquals("+82", formatter.inputDigit('2'));
- assertEquals("+825", formatter.inputDigit('5'));
- assertEquals("+8251", formatter.inputDigit('1'));
- assertEquals("+82 512", formatter.inputDigit('2'));
+ assertEquals("+82 ", formatter.inputDigit('2'));
+ assertEquals("+82 5", formatter.inputDigit('5'));
+ assertEquals("+82 51", formatter.inputDigit('1'));
+ assertEquals("+82 51-2", formatter.inputDigit('2'));
assertEquals("+82 51-23", formatter.inputDigit('3'));
assertEquals("+82 51-234", formatter.inputDigit('4'));
assertEquals("+82 51-234-5", formatter.inputDigit('5'));
@@ -416,10 +463,10 @@ public class AsYouTypeFormatterTest extends TestCase {
formatter.clear();
assertEquals("+", formatter.inputDigit('+'));
assertEquals("+8", formatter.inputDigit('8'));
- assertEquals("+82", formatter.inputDigit('2'));
- assertEquals("+822", formatter.inputDigit('2'));
- assertEquals("+8225", formatter.inputDigit('5'));
- assertEquals("+82 253", formatter.inputDigit('3'));
+ assertEquals("+82 ", formatter.inputDigit('2'));
+ assertEquals("+82 2", formatter.inputDigit('2'));
+ assertEquals("+82 25", formatter.inputDigit('5'));
+ assertEquals("+82 2-53", formatter.inputDigit('3'));
assertEquals("+82 2-531", formatter.inputDigit('1'));
assertEquals("+82 2-531-5", formatter.inputDigit('5'));
assertEquals("+82 2-531-56", formatter.inputDigit('6'));
@@ -430,10 +477,10 @@ public class AsYouTypeFormatterTest extends TestCase {
formatter.clear();
assertEquals("+", formatter.inputDigit('+'));
assertEquals("+8", formatter.inputDigit('8'));
- assertEquals("+82", formatter.inputDigit('2'));
- assertEquals("+822", formatter.inputDigit('2'));
- assertEquals("+8223", formatter.inputDigit('3'));
- assertEquals("+82 236", formatter.inputDigit('6'));
+ assertEquals("+82 ", formatter.inputDigit('2'));
+ assertEquals("+82 2", formatter.inputDigit('2'));
+ assertEquals("+82 23", formatter.inputDigit('3'));
+ assertEquals("+82 2-36", formatter.inputDigit('6'));
assertEquals("+82 2-366", formatter.inputDigit('6'));
assertEquals("+82 2-3665", formatter.inputDigit('5'));
assertEquals("+82 2-3665-5", formatter.inputDigit('5'));
@@ -441,21 +488,21 @@ public class AsYouTypeFormatterTest extends TestCase {
assertEquals("+82 2-3665-567", formatter.inputDigit('7'));
assertEquals("+82 2-3665-5678", formatter.inputDigit('8'));
- // 02-114 : This is too short to format. Checking that there are no side-effects.
+ // 02-114
formatter.clear();
assertEquals("0", formatter.inputDigit('0'));
assertEquals("02", formatter.inputDigit('2'));
assertEquals("021", formatter.inputDigit('1'));
- assertEquals("0211", formatter.inputDigit('1'));
- assertEquals("02114", formatter.inputDigit('4'));
+ assertEquals("02-11", formatter.inputDigit('1'));
+ assertEquals("02-114", formatter.inputDigit('4'));
// 02-1300
formatter.clear();
assertEquals("0", formatter.inputDigit('0'));
assertEquals("02", formatter.inputDigit('2'));
assertEquals("021", formatter.inputDigit('1'));
- assertEquals("0213", formatter.inputDigit('3'));
- assertEquals("02130", formatter.inputDigit('0'));
+ assertEquals("02-13", formatter.inputDigit('3'));
+ assertEquals("02-130", formatter.inputDigit('0'));
assertEquals("02-1300", formatter.inputDigit('0'));
// 011-456-7890
@@ -463,8 +510,8 @@ public class AsYouTypeFormatterTest extends TestCase {
assertEquals("0", formatter.inputDigit('0'));
assertEquals("01", formatter.inputDigit('1'));
assertEquals("011", formatter.inputDigit('1'));
- assertEquals("0114", formatter.inputDigit('4'));
- assertEquals("01145", formatter.inputDigit('5'));
+ assertEquals("011-4", formatter.inputDigit('4'));
+ assertEquals("011-45", formatter.inputDigit('5'));
assertEquals("011-456", formatter.inputDigit('6'));
assertEquals("011-456-7", formatter.inputDigit('7'));
assertEquals("011-456-78", formatter.inputDigit('8'));
@@ -476,8 +523,8 @@ public class AsYouTypeFormatterTest extends TestCase {
assertEquals("0", formatter.inputDigit('0'));
assertEquals("01", formatter.inputDigit('1'));
assertEquals("011", formatter.inputDigit('1'));
- assertEquals("0119", formatter.inputDigit('9'));
- assertEquals("01198", formatter.inputDigit('8'));
+ assertEquals("011-9", formatter.inputDigit('9'));
+ assertEquals("011-98", formatter.inputDigit('8'));
assertEquals("011-987", formatter.inputDigit('7'));
assertEquals("011-9876", formatter.inputDigit('6'));
assertEquals("011-9876-7", formatter.inputDigit('7'));
@@ -485,4 +532,52 @@ public class AsYouTypeFormatterTest extends TestCase {
assertEquals("011-9876-789", formatter.inputDigit('9'));
assertEquals("011-9876-7890", formatter.inputDigit('0'));
}
+
+ public void testAYTFMultipleLeadingDigitPatterns() {
+ // +81 50 2345 6789
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("JP");
+ assertEquals("+", formatter.inputDigit('+'));
+ assertEquals("+8", formatter.inputDigit('8'));
+ assertEquals("+81 ", formatter.inputDigit('1'));
+ assertEquals("+81 5", formatter.inputDigit('5'));
+ assertEquals("+81 50", formatter.inputDigit('0'));
+ assertEquals("+81 50 2", formatter.inputDigit('2'));
+ assertEquals("+81 50 23", formatter.inputDigit('3'));
+ assertEquals("+81 50 234", formatter.inputDigit('4'));
+ assertEquals("+81 50 2345", formatter.inputDigit('5'));
+ assertEquals("+81 50 2345 6", formatter.inputDigit('6'));
+ assertEquals("+81 50 2345 67", formatter.inputDigit('7'));
+ assertEquals("+81 50 2345 678", formatter.inputDigit('8'));
+ assertEquals("+81 50 2345 6789", formatter.inputDigit('9'));
+
+ // +81 222 12 5678
+ formatter.clear();
+ assertEquals("+", formatter.inputDigit('+'));
+ assertEquals("+8", formatter.inputDigit('8'));
+ assertEquals("+81 ", formatter.inputDigit('1'));
+ assertEquals("+81 2", formatter.inputDigit('2'));
+ assertEquals("+81 22", formatter.inputDigit('2'));
+ assertEquals("+81 22 2", formatter.inputDigit('2'));
+ assertEquals("+81 22 21", formatter.inputDigit('1'));
+ assertEquals("+81 2221 2", formatter.inputDigit('2'));
+ assertEquals("+81 222 12 5", formatter.inputDigit('5'));
+ assertEquals("+81 222 12 56", formatter.inputDigit('6'));
+ assertEquals("+81 222 12 567", formatter.inputDigit('7'));
+ assertEquals("+81 222 12 5678", formatter.inputDigit('8'));
+
+ // +81 3332 2 5678
+ formatter.clear();
+ assertEquals("+", formatter.inputDigit('+'));
+ assertEquals("+8", formatter.inputDigit('8'));
+ assertEquals("+81 ", formatter.inputDigit('1'));
+ assertEquals("+81 3", formatter.inputDigit('3'));
+ assertEquals("+81 33", formatter.inputDigit('3'));
+ assertEquals("+81 33 3", formatter.inputDigit('3'));
+ assertEquals("+81 3332", formatter.inputDigit('2'));
+ assertEquals("+81 3332 2", formatter.inputDigit('2'));
+ assertEquals("+81 3332 2 5", formatter.inputDigit('5'));
+ assertEquals("+81 3332 2 56", formatter.inputDigit('6'));
+ assertEquals("+81 3332 2 567", formatter.inputDigit('7'));
+ assertEquals("+81 3332 2 5678", formatter.inputDigit('8'));
+ }
}
diff --git a/java/test/com/google/i18n/phonenumbers/PhoneNumberMetadataProtoForTesting b/java/test/com/google/i18n/phonenumbers/PhoneNumberMetadataProtoForTesting
index 8b72ac93..7f085cff 100644
--- a/java/test/com/google/i18n/phonenumbers/PhoneNumberMetadataProtoForTesting
+++ b/java/test/com/google/i18n/phonenumbers/PhoneNumberMetadataProtoForTesting
Binary files differ
diff --git a/java/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java b/java/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java
index cab8140d..e6af641b 100644
--- a/java/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java
+++ b/java/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java
@@ -59,14 +59,16 @@ public class PhoneNumberUtilTest extends TestCase {
super.tearDown();
}
- private boolean assertEquals(PhoneNumber number1, PhoneNumber number2) {
+ private void assertEquals(PhoneNumber number1, PhoneNumber number2) {
+ boolean equal = false;
if (number1 == null && number2 == null) {
- return true;
+ equal = true;
+ } else if (number1 != null && number2 != null) {
+ equal = number1.exactlySameAs(number2);
}
- if (number1 == null || number2 == null) {
- return false;
+ if (!equal) {
+ fail("The phone numbers do not match");
}
- return number1.exactlySameAs(number2);
}
public void testGetInstanceLoadUSMetadata() throws IOException {
@@ -74,7 +76,7 @@ public class PhoneNumberUtilTest extends TestCase {
assertEquals("US", metadata.getId());
assertEquals(1, metadata.getCountryCode());
assertEquals("011", metadata.getInternationalPrefix());
- assertFalse(metadata.hasNationalPrefix());
+ assertTrue(metadata.hasNationalPrefix());
assertEquals(2, metadata.getNumberFormatCount());
assertEquals("(\\d{3})(\\d{3})(\\d{4})",
metadata.getNumberFormat(0).getPattern());
@@ -96,11 +98,12 @@ public class PhoneNumberUtilTest extends TestCase {
assertEquals(49, metadata.getCountryCode());
assertEquals("00", metadata.getInternationalPrefix());
assertEquals("0", metadata.getNationalPrefix());
- assertEquals(6, metadata.getNumberFormatCount());
- assertEquals("9009", metadata.getNumberFormat(5).getLeadingDigits());
- assertEquals("(\\d{3})(\\d{4})(\\d{4})",
- metadata.getNumberFormat(5).getPattern());
- assertEquals("$1 $2 $3", metadata.getNumberFormat(5).getFormat());
+ assertEquals(5, metadata.getNumberFormatCount());
+ assertEquals(1, metadata.getNumberFormat(4).getLeadingDigitsPatternCount());
+ assertEquals("900", metadata.getNumberFormat(4).getLeadingDigitsPattern(0));
+ assertEquals("(\\d{3})(\\d{3,4})(\\d{4})",
+ metadata.getNumberFormat(4).getPattern());
+ assertEquals("$1 $2 $3", metadata.getNumberFormat(4).getFormat());
assertEquals("(?:[24-6]\\d{2}|3[03-9]\\d|[789](?:[1-9]\\d|0[2-9]))\\d{3,8}",
metadata.getFixedLine().getNationalNumberPattern());
assertEquals("\\d{2,14}", metadata.getFixedLine().getPossibleNumberPattern());
@@ -329,6 +332,13 @@ public class PhoneNumberUtilTest extends TestCase {
phoneUtil.format(deNumber,
PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL));
deNumber.clear();
+ deNumber.setCountryCode(49).setNationalNumber(80212345L);
+ assertEquals("08021 2345", phoneUtil.format(deNumber,
+ PhoneNumberUtil.PhoneNumberFormat.NATIONAL));
+ assertEquals("+49 8021 2345",
+ phoneUtil.format(deNumber,
+ PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL));
+ deNumber.clear();
deNumber.setCountryCode(49).setNationalNumber(1234L);
// Note this number is correctly formatted without national prefix. Most of the numbers that
// are treated as invalid numbers by the library are short numbers, and they are usually not
@@ -516,6 +526,21 @@ public class PhoneNumberUtilTest extends TestCase {
PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL,
newNumberFormats));
+ // $NP is set to '1' for the US. Here we check that for other NANPA countries the US rules are
+ // followed.
+ newNumFormat.setNationalPrefixFormattingRule("$NP ($FG)");
+ newNumFormat.setFormat("$1 $2-$3");
+ PhoneNumber bsNumber = new PhoneNumber();
+ bsNumber.setCountryCode(1).setNationalNumber(4168819999L);
+ assertEquals("1 (416) 881-9999",
+ phoneUtil.formatByPattern(bsNumber,
+ PhoneNumberUtil.PhoneNumberFormat.NATIONAL,
+ newNumberFormats));
+ assertEquals("+1 416 881-9999",
+ phoneUtil.formatByPattern(bsNumber,
+ PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL,
+ newNumberFormats));
+
PhoneNumber itNumber = new PhoneNumber();
itNumber.setCountryCode(39).setNationalNumber(236618300L).setItalianLeadingZero(true);
@@ -783,7 +808,7 @@ public class PhoneNumberUtilTest extends TestCase {
// This number is no longer valid.
assertFalse(phoneUtil.isValidNumber(bsNumber));
- // La Mayotte and RŽunion use 'leadingDigits' to differentiate them.
+ // La Mayotte and Reunion use 'leadingDigits' to differentiate them.
PhoneNumber reNumber = new PhoneNumber();
reNumber.setCountryCode(262).setNationalNumber(262123456L);
assertTrue(phoneUtil.isValidNumber(reNumber));
@@ -793,7 +818,7 @@ public class PhoneNumberUtilTest extends TestCase {
reNumber.setNationalNumber(269601234L);
assertTrue(phoneUtil.isValidNumberForRegion(reNumber, "YT"));
assertFalse(phoneUtil.isValidNumberForRegion(reNumber, "RE"));
- // This number is no longer valid for La RŽunion.
+ // This number is no longer valid for La Reunion.
reNumber.setNationalNumber(269123456L);
assertFalse(phoneUtil.isValidNumberForRegion(reNumber, "YT"));
assertFalse(phoneUtil.isValidNumberForRegion(reNumber, "RE"));
@@ -950,6 +975,58 @@ public class PhoneNumberUtilTest extends TestCase {
assertFalse(phoneUtil.isPossibleNumber("+44 300", "GB"));
}
+ public void testTruncateTooLongNumber() {
+ // US number 650-253-0000, but entered with one additional digit at the end.
+ PhoneNumber tooLongNumber = new PhoneNumber();
+ tooLongNumber.setCountryCode(1).setNationalNumber(65025300001L);
+ PhoneNumber validNumber = new PhoneNumber();
+ validNumber.setCountryCode(1).setNationalNumber(6502530000L);
+ assertTrue(phoneUtil.truncateTooLongNumber(tooLongNumber));
+ assertEquals(validNumber, tooLongNumber);
+
+ // GB number 080 1234 5678, but entered with 4 extra digits at the end.
+ tooLongNumber.clear();
+ tooLongNumber.setCountryCode(44).setNationalNumber(80123456780123L);
+ validNumber.clear();
+ validNumber.setCountryCode(44).setNationalNumber(8012345678L);
+ assertTrue(phoneUtil.truncateTooLongNumber(tooLongNumber));
+ assertEquals(validNumber, tooLongNumber);
+
+ // IT number 022 3456 7890, but entered with 3 extra digits at the end.
+ tooLongNumber.clear();
+ tooLongNumber.setCountryCode(39).setNationalNumber(2234567890123L).setItalianLeadingZero(true);
+ validNumber.clear();
+ validNumber.setCountryCode(39).setNationalNumber(2234567890L).setItalianLeadingZero(true);
+ assertTrue(phoneUtil.truncateTooLongNumber(tooLongNumber));
+ assertEquals(validNumber, tooLongNumber);
+
+ // Tests what happens when a valid number is passed in.
+ PhoneNumber validNumberCopy = new PhoneNumber();
+ validNumberCopy.mergeFrom(validNumber);
+ assertTrue(phoneUtil.truncateTooLongNumber(validNumber));
+ // Tests the number is not modified.
+ assertEquals(validNumberCopy, validNumber);
+
+ // Tests what happens when a number with invalid prefix is passed in.
+ PhoneNumber numberWithInvalidPrefix = new PhoneNumber();
+ // The test metadata says US numbers cannot have prefix 240.
+ numberWithInvalidPrefix.setCountryCode(1).setNationalNumber(2401234567L);
+ PhoneNumber invalidNumberCopy = new PhoneNumber();
+ invalidNumberCopy.mergeFrom(numberWithInvalidPrefix);
+ assertFalse(phoneUtil.truncateTooLongNumber(numberWithInvalidPrefix));
+ // Tests the number is not modified.
+ assertEquals(invalidNumberCopy, numberWithInvalidPrefix);
+
+ // Tests what happens when a too short number is passed in.
+ PhoneNumber tooShortNumber = new PhoneNumber();
+ tooShortNumber.setCountryCode(1).setNationalNumber(1234L);
+ PhoneNumber tooShortNumberCopy = new PhoneNumber();
+ tooShortNumberCopy.mergeFrom(tooShortNumber);
+ assertFalse(phoneUtil.truncateTooLongNumber(tooShortNumber));
+ // Tests the number is not modified.
+ assertEquals(tooShortNumberCopy, tooShortNumber);
+ }
+
public void testIsViablePhoneNumber() {
// Only one or two digits before strange non-possible punctuation.
assertFalse(PhoneNumberUtil.isViablePhoneNumber("12. March"));
@@ -1186,7 +1263,7 @@ public class PhoneNumberUtilTest extends TestCase {
}
number.clear();
try {
- String phoneNumber = "(1 610) 619 43 446";
+ String phoneNumber = "(1 610) 619 43";
StringBuffer numberToFill = new StringBuffer();
assertEquals("Should not have extracted a country code - invalid number both before and " +
"after extraction of uncertain country code.",
@@ -1485,15 +1562,15 @@ public class PhoneNumberUtilTest extends TestCase {
assertEquals(nzNumber, phoneUtil.parse("03 3316005 #3456", "NZ"));
// Test the following do not extract extensions:
PhoneNumber nonExtnNumber = new PhoneNumber();
- nonExtnNumber.setCountryCode(1).setNationalNumber(180074935247L);
+ nonExtnNumber.setCountryCode(1).setNationalNumber(80074935247L);
assertEquals(nonExtnNumber, phoneUtil.parse("1800 six-flags", "US"));
assertEquals(nonExtnNumber, phoneUtil.parse("1800 SIX FLAGS", "US"));
- assertEquals(nonExtnNumber, phoneUtil.parse("0~01 1800 7493 5247", "PL"));
+ assertEquals(nonExtnNumber, phoneUtil.parse("0~0 1800 7493 5247", "PL"));
assertEquals(nonExtnNumber, phoneUtil.parse("(1800) 7493.5247", "US"));
// Check that the last instance of an extension token is matched.
PhoneNumber extnNumber = new PhoneNumber();
- extnNumber.setCountryCode(1).setNationalNumber(180074935247L).setExtension("1234");
- assertEquals(extnNumber, phoneUtil.parse("0~01 1800 7493 5247 ~1234", "PL"));
+ extnNumber.setCountryCode(1).setNationalNumber(80074935247L).setExtension("1234");
+ assertEquals(extnNumber, phoneUtil.parse("0~0 1800 7493 5247 ~1234", "PL"));
// Verifying bug-fix where the last digit of a number was previously omitted if it was a 0 when
// extracting the extension. Also verifying a few different cases of extensions.
PhoneNumber ukNumber = new PhoneNumber();
@@ -1537,10 +1614,10 @@ public class PhoneNumberUtilTest extends TestCase {
public void testParseAndKeepRaw() throws Exception {
PhoneNumber alphaNumericNumber = new PhoneNumber();
alphaNumericNumber.
- setCountryCode(1).setNationalNumber(180074935247L).setRawInput("1800 six-flags").
+ setCountryCode(1).setNationalNumber(80074935247L).setRawInput("800 six-flags").
setCountryCodeSource(CountryCodeSource.FROM_DEFAULT_COUNTRY);
assertEquals(alphaNumericNumber,
- phoneUtil.parseAndKeepRawInput("1800 six-flags", "US"));
+ phoneUtil.parseAndKeepRawInput("800 six-flags", "US"));
alphaNumericNumber.
setCountryCode(1).setNationalNumber(8007493524L).setRawInput("1800 six-flag").
diff --git a/java/test/com/google/i18n/phonenumbers/RegexCacheTest.java b/java/test/com/google/i18n/phonenumbers/RegexCacheTest.java
index 310a601c..2ad0abea 100644
--- a/java/test/com/google/i18n/phonenumbers/RegexCacheTest.java
+++ b/java/test/com/google/i18n/phonenumbers/RegexCacheTest.java
@@ -18,8 +18,6 @@ package com.google.i18n.phonenumbers;
import junit.framework.TestCase;
-import java.util.regex.Pattern;
-
/**
* Unittests for LRU Cache for compiled regular expressions used by the libphonenumbers libary.
*