Was ist der beste Weg für die Umwandlung von Telefonnummern in international format (E. 164), die mit Java?

StackOverflow https://stackoverflow.com/questions/187216

Frage

Was ist der beste Weg für die Umwandlung von Telefonnummern in international format (E. 164), die mit Java?

Da ein "Handy Anzahl" und einem Land, id (sagen wir, eine ISO country code), möchte ich wandeln es in ein standard E. 164 der internationalen format Telefonnummer.

Ich bin sicher, ich kann tun es durch hand, ganz leicht, aber ich wäre nicht sicher, dass es korrekt funktionieren würde, in allen Situationen.

Die Java-framework/library/utility würden Sie empfehlen, um dies zu erreichen?

P. S.Die 'Telefonnummer' kann alles sein, erkennbar durch die öffentlichkeit - wie

* (510) 786-0404
* 1-800-GOT-MILK
* +44-(0)800-7310658

das Letzte ist mein Favorit - es ist, wie einige Leute schreiben Ihre Zahl in Großbritannien-und bedeutet, dass Sie entweder mit den +44 oder verwenden Sie die 0.

Das E. 164-format-Nummer sollte alle numerischen und verwenden Sie die vollständige Landesvorwahl (z.B.+44)

War es hilfreich?

Lösung

Google stellt eine Bibliothek für mit Telefonnummern arbeiten. Das gleiche sie für Android verwenden

http://code.google.com/p/libphonenumber/

String swissNumberStr = "044 668 18 00"
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
try {
  PhoneNumber swissNumberProto = phoneUtil.parse(swissNumberStr, "CH");
} catch (NumberParseException e) {
  System.err.println("NumberParseException was thrown: " + e.toString());
}

// Produces "+41 44 668 18 00"
System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.INTERNATIONAL));
// Produces "044 668 18 00"
System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.NATIONAL));
// Produces "+41446681800"
System.out.println(phoneUtil.format(swissNumberProto, PhoneNumberFormat.E164));

Andere Tipps

Ich spreche aus Erfahrung zu schreiben, diese Art der Sache, es ist wirklich schwer zu tun mit 100% Zuverlässigkeit.Ich geschrieben habe etwas Java-code, um dies zu tun, der ist ziemlich gut in der Verarbeitung der Daten, die wir haben, aber nicht anwendbar sein in jedem Land.Fragen, die Sie stellen müssen, sind:

Sind das Zeichen Anzahl Zuordnungen konsequent zwischen den Ländern?Der US-verwendet eine Menge von diesen (z.B. 1800-GOT-MILCH), aber in Australien, als ein Beispiel, ziemlich selten.Was würden Sie tun müssen, ist sicherzustellen, dass Sie den korrekten Zuordnung für das Land in der Frage, ob es variiert (mag es nicht).Ich weiß nicht, was die Länder, dass die Verwendung unterschiedlicher Alphabete (z.B. Cyrilic in Russland und den ehemaligen Ostblock-Staaten) tun;

Sie müssen akzeptieren, dass Ihre Lösung nicht 100% und Sie sollten nicht erwarten, es zu werden.Sie brauchen einen "best guess" - Ansatz.Zum Beispiel, es gibt keine wirkliche Art zu wissen, dass 132345, ist eine gültige Telefon Zahl in Australien als 1300 123 456, diese aber nur zwei Muster für 13xx zahlen, und Sie sind nicht kündbar aus übersee;

Sie haben auch Fragen, wenn Sie wollen zu überprüfen Regionen (area codes).Ich glaube, dass die UNS verwendet ein system, bei dem die zweite Ziffer der Vorwahl eine 1 oder eine 0.Dies kann einmal der Fall, aber ich bin mir nicht sicher, ob es noch gilt.Was auch immer der Fall, viele andere Länder haben andere Regeln.In Australien, die gültige Vorwahl für Festnetz-und Mobiltelefone herstellen (zwei Ziffern (die erste 0 ist).08, 03 und 04 sind alle gültig.01 nicht.Wie tun Sie sorgen für, dass?Tun Sie wollen?

Länder verwenden unterschiedliche Konventionen egal, wie viele Ziffern Sie schreiben.Sie haben zu entscheiden, ob Sie das akzeptieren wollen etwas anderes als die "norm".Diese sind Häufig in Australien:

  • (02) 1234 5678
  • 02 1234 5678
  • 0411 123 123 (aber ich habe nie gesehen, 04 1112 3456)
  • 131 123
  • 13 1123
  • 131 123
  • 1 300 123 123
  • 1300 123 123
  • 02-1234-5678
  • 1300-234-234
  • +44 78 1234 1234
  • +44 (0)78 1234 1234
  • +44-78-1234-1234
  • +44-(0)78-1234-1234
  • 0011 44 78 1234 1234 (0011 ist die standard international dialling code)
  • (44) 078 1234 1234 (nicht gemeinsame)

Und das ist nur aus der Spitze von meinem Kopf.Für ein Land.In Frankreich, zum Beispiel, die gemeinsame schreiben die Telefon Nummer in Anzahl Paare (12 34 56 78) und Sie sprechen es auch so:statt:

UNO (eins), deux (zwei), trois (drei), ...

seine

douze (zwölf), trente-quatre (vierunddreißig) ...

Tun Sie wollen zu sorgen, dass die Ebene der kulturellen Differenz?Ich würde davon ausgehen, nicht aber die Frage ist eine überlegung Wert, nur in Fall, Sie machen die Regeln zu streng.

Auch manche Menschen können Anhängen, Durchwahl-Telefonnummern, möglicherweise mit dem "extern" oder ähnliche Abkürzung.Wollen Sie bieten für, dass?

Sorry, kein code hier.Nur eine Liste von Fragen an sich selbst und Fragen zu berücksichtigen.Wie andere gesagt haben, ist eine Reihe von regulären Ausdrücken können viel tun, der oben, aber letztlich Telefonnummer Feldern sind (meistens) free form text am Ende des Tages.

Dies war meine Lösung:

public static String FixPhoneNumber(Context ctx, String rawNumber)
{
    String      fixedNumber = "";

    // get current location iso code
    TelephonyManager    telMgr = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
    String              curLocale = telMgr.getNetworkCountryIso().toUpperCase();

    PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
    Phonenumber.PhoneNumber     phoneNumberProto;

    // gets the international dialling code for our current location
    String              curDCode = String.format("%d", phoneUtil.getCountryCodeForRegion(curLocale));
    String              ourDCode = "";

    if(rawNumber.indexOf("+") == 0)
    {
        int     bIndex = rawNumber.indexOf("(");
        int     hIndex = rawNumber.indexOf("-");
        int     eIndex = rawNumber.indexOf(" ");

        if(bIndex != -1)
        {
            ourDCode = rawNumber.substring(1, bIndex);
        }
        else if(hIndex != -1) 
        {               
            ourDCode = rawNumber.substring(1, hIndex);
        }
        else if(eIndex != -1)
        {
            ourDCode = rawNumber.substring(1, eIndex);
        }
        else
        {
            ourDCode = curDCode;
        }           
    }
    else
    {
        ourDCode = curDCode;
    }

    try 
    {
      phoneNumberProto = phoneUtil.parse(rawNumber, curLocale);
    } 

    catch (NumberParseException e) 
    {
      return rawNumber;
    }

    if(curDCode.compareTo(ourDCode) == 0)
        fixedNumber = phoneUtil.format(phoneNumberProto, PhoneNumberFormat.NATIONAL);
    else
        fixedNumber = phoneUtil.format(phoneNumberProto, PhoneNumberFormat.INTERNATIONAL);

    return fixedNumber.replace(" ", "");
}

Ich hoffe, das jemand mit dem gleichen Problem hilft.

Genießen und frei nutzen.

Danke für die Antworten. Wie in der ursprünglichen Frage gesagt, ich bin viel mehr daran interessiert, in der Formatierung der Nummer in das Standardformat, als ich bei der Bestimmung bin, wenn es sich um eine gültig ist (wie in echt) Telefonnummer.

Ich habe einig handgearbeiteten Code zur Zeit, die eine Telefonnummer String nimmt und einen Quelle Länderkontext und Zielland Kontext (das Land aus (wie vom Benutzer eingegeben), in dem die Nummer gewählt wird, und das Land, wo die Zahl gewählt wird - wird dies dem System bekannt ist) und führt dann die folgende Umwandlung in Schritten

  1. Streifen alle Leerzeichen aus der Nummer

  2. alle alpha in Ziffern übersetzen - eine Lookup-Tabelle des Briefes an Ziffer (zB A -> 2, B -> 2, C -> 2, D -> 3) usw. für den Tastatur (ich war nicht bewusst, dass einige Tastaturen dieses unterschiedlich verteilen)

  3. alle Interpunktion Strip -. Hält ein vorhergehende '+' intakt, wenn es vorhanden ist (falls die Nummer bereits in einer Art internationalen Formats)

  4. Sie fest, ob die Nummer eine internationale Vorwahl für das Land Kontext hat - z wenn Quelle Kontext das Vereinigte Königreich ist, würde ich sehen, ob es mit einem ‚00‘ beginnt - und ersetzen Sie es mit einem ‚+‘. Ich überprüfe derzeit nicht, ob die Ziffern nach dem ‚00‘ durch die internationale Vorwahl gefolgt sind für das Zielland. Ich sehe die internationale Vorwahl für das Herkunftsland in einer Lookup-Tabelle nach oben (zum Beispiel GB -> '00', US -.> '011' usw.)

  5. Sie fest, ob die Zahl eine lokale Vorwahl für das Land Kontext hat - z wenn die Quelle Kontext das Vereinigte Königreich ist, würde ich schauen, um zu sehen, ob es mit einem ‚0‘ beginnt - und ersetzen Sie es mit einem ‚+‘ durch die internationale Vorwahl für das Zielland gefolgt. Ich blicke auf die lokale Vorwahl für das Herkunftsland in einer Lookup-Tabelle (zB GB -> ‚0‘, US -> ‚1‘ usw.) und die internationale Vorwahl für das Zielland in einer anderen Lookup-Tabelle ( eg'GB '=' 44' , US = '1')

Es scheint alles zu funktionieren die ich bisher auf sie geworfen haben - mit Ausnahme der +44 (0) 1234-567-890 Situation - Ich werde einen Sonderfall Check für diesen einen hinzufügen

.

Das Schreiben ist es nicht schwer war - und ich besondere Fälle für jede seltsame Ausnahme hinzufügen kann ich über gekommen. Aber ich würde wirklich gerne wissen, ob es eine Standardlösung ist.

Die Telefongesellschaften scheinen mit dieser Sache zu beschäftigen täglich. Ich habe nie inkonsistente Ergebnisse, wenn Wählen von Nummern des PSTN verwenden. Zum Beispiel in den USA (wo Mobiltelefone die gleichen Ortsvorwahl wie Festnetz haben, konnte ich + 1-123-456-7890 wählen, oder 011-1-123-456-7890 (wobei 011 die internationale Vorwahl in der ist USA und 1 ist die internationale Vorwahl für die USA), 1-123-456-7890 (wobei 1 die lokale Vorwahl in den USA) oder sogar 456-7890 (vorausgesetzt, ich in der 123 Ortsnetzkennzahl zu der Zeit war) und erhält die gleichen Ergebnisse jedes Mal. ich gehe davon aus, dass intern diese gewählten Nummern auf das gleiche E.164-Standardformat konvertiert werden, und dass man die Umsetzung alle in Software.

Um ehrlich zu sein, es klingt wie Sie die meisten der Basen bereits abgedeckt haben.

Das +44 (0) 800 Format manchmal (fälschlicherweise) in Großbritannien verwendet wird, ist ärgerlich und ist nicht streng gültig nach E.123, das ist die ITU-T-Empfehlung für wie Zahlen angezeigt werden sollen. Wenn Sie nicht eine Kopie von E.123 bekommen haben ist es einen Blick wert.

Für das, was es wert ist, das Telefonnetz selbst nicht immer E.164 verwenden. Oft gibt es eine Flagge in der ISDN-Signalisierung von der TK-Anlage erzeugt werden (oder im Netzwerk, wenn Sie auf einem Dampf Telefon sind), die das Netz angibt, ob die gewählte Nummer ist lokal, national oder international.

Dies ist eine sehr schwierige Aufgabe, wie Telefonnummern in jedem Land anders fast geschrieben werden.

Wir haben eine Liste von regulären Ausdrücken zu halten (wir 19 Formate unterstützt) 3 Teile einer Zahl zu analysieren und dann konvertiert diese drei Teile zu „+ {1} {2} {3}“.

Sortieren regexps durch spezifischere zuerst und dann die erste nehmen, die beim Parsen erfolgreich ist.

In einigen Ländern können Sie 112 als gültige Telefonnummer bestätigen, aber wenn Sie einen Ländercode vor ihm bleiben wird es keine Gültigkeit mehr. In anderen Ländern können Sie nicht 112 validieren, sondern Sie können 911 als gültige Telefonnummer bestätigen.

Ich habe einige Telefone gesehen, dass Q auf die Taste 7 und Z auf der Taste 9 gesetzt. Ich habe einige Telefone gesehen, dass Q und Z auf der Taste 0 gesetzt, und einige, die Q und Z auf der 1-Taste setzen.

Ein Bereich Code, der gestern gab es vielleicht nicht heute, und umgekehrt vorhanden ist.

In der Hälfte von Nordamerika (Ländercode 1), die zweiten Regel Ziffer verwendete 0 oder 1 für postleitzahlen sein, aber diese Regel ging vor 10 Jahren weg.

Ich bin mir nicht bewusst eine Standard-Bibliothek oder verfügbaren Rahmen für die Formatierung von Telefonnummern in E.164.

Die Lösung für unser Produkt verwendet, die PBX-Anrufer-ID muss formatiert werden in E.164 vorgesehen ist, ist eine Datei (Datenbanktabelle) bereitstellen anwendbar die E.164-Format Informationen für alle Länder. Dies hat den Vorteil, dass die Anwendung aktualisiert werden kann (all seltsame Ecke Fälle in verschiedenen PSTN-Netzen zu handhaben) w / out Änderungen an die Produktion Code-Basis erforderlich ist.

Die Tabelle enthält eine Zeile für jeden Ländercode und Informationen über Ortsvorwahl Länge und Teilnehmer Länge. Es können mehrere Einträge für ein Land sein, je nachdem, welche Variationen sind möglich mit Ortsvorwahl und Teilnehmernummer Längen.

Mit Neuseeland PSTN (Teil-) Wählplan als ein Beispiel der Tabelle ..

CC  AREA_CODE  AREA_CODE_LENGTH  SUBSCRIBER  SUBSCRIBER_LENGTH
64                            1              7
64         21                 2              7
64        275                 3              6

Wir tun etwas ähnlich, was Sie beschrieben haben, dh Streifen der bereitgestellten Telefonnummer einer nicht-nummerische Zeichen und dann Format auf verschiedenen Regeln basieren Gesamtzahl Plan Länge in Bezug auf, außerhalb eines Zugangscodes und Fern / internationalen Zugangscodes.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top