Code-Land aus Telefonnummer extrahieren [libphonenumber]

81

Ich habe eine Zeichenfolge wie diese: +33123456789 (französische Telefonnummer). Ich möchte den Ländercode (+33) extrahieren, ohne das Land zu kennen. Zum Beispiel sollte es funktionieren, wenn ich ein anderes Telefon aus einem anderen Land habe. Ich verwende die Google-Bibliothek https://code.google.com/p/libphonenumber/ .

Wenn ich das Land kenne, ist es cool, dass ich den Ländercode finde:

PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
int countryCode = phoneUtil.getCountryCodeForRegion(locale.getCountry());

Aber ich finde keinen Weg, einen String zu analysieren, ohne das Land zu kennen.

mrroboaat
quelle
Mögliches Duplikat von Telefon-Ländercode mit Android abrufen
Simon
1
Der erste Link basiert auf der Landesvorwahl des Telefons. Aber in meinem Fall kann ich eine Zeichenfolge haben, die eine französische Telefonnummer mit einem englischen Telefon ist. Wenn ich also das aktuelle Gebietsschema
abrufe

Antworten:

127

Okay, ich bin der Google-Gruppe libphonenumber beigetreten ( https://groups.google.com/forum/?hl=de&fromgroups#!forum/libphonenumber-discuss ) und habe eine Frage gestellt.

Ich muss das Land nicht im Parameter einstellen, wenn meine Telefonnummer mit "+" beginnt. Hier ist ein Beispiel :

PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
try {
    // phone must begin with '+'
    PhoneNumber numberProto = phoneUtil.parse(phone, "");
    int countryCode = numberProto.getCountryCode();
} catch (NumberParseException e) {
    System.err.println("NumberParseException was thrown: " + e.toString());
}
mrroboaat
quelle
6
Diese verrückte Wackadoo-Bibliothek ist unglaublich und eine Milliarde Mal besser als die enthaltene PhoneNumberUtil- sBibliothek in Android
Aphex
@aat würden Sie mir sagen, wie es funktionieren wird, ohne countryISOCode in (phoneUtil.parse (phone, "");) Ihrer Antwort zu verwenden, bitte antworten Sie
Ash
1
@ Shweta Wenn Sie eine Frage haben, posten Sie sie bitte in einem neuen Thread auf SO
mrroboaat
1
@aat ok, aber Ihre Antwort ist nicht korrekt, ohne einen countryISOCode anzugeben, wird dieser Code nicht ausgeführt
Ash
3
Der Parameter @Schweta defaultRegion sollte null sein: defaultRegion - Der aus zwei Buchstaben bestehende Regionscode nach ISO 3166-1, der den Bereich angibt, von dem die Nummer erwartet wird. Dies wird nur verwendet, wenn die zu analysierende Nummer nicht im internationalen Format geschrieben ist. Der Ländercode für die Nummer wird in diesem Fall als der der angegebenen Standardregion gespeichert. Wenn die Nummer garantiert mit einem '+' gefolgt von der Landesvorwahl beginnt, kann "ZZ" oder null angegeben werden.
Xnagyg
3

Hier können Sie die Telefonnummer als international formatierte Telefonnummer speichern

internationalFormatPhoneNumber = phoneUtil.format(givenPhoneNumber, PhoneNumberFormat.INTERNATIONAL);

Die Telefonnummer wird im internationalen Format +94 71 560 4888 zurückgegeben

Jetzt habe ich also die Landesvorwahl

String countryCode = internationalFormatPhoneNumber.substring(0,internationalFormatPhoneNumber.indexOf('')).replace('+', ' ').trim();

Hoffe das wird dir helfen

Thilina Rubasingha
quelle
1
Was ist internationalFormatPhoneNumberDataType und phoneUtil
Kartheeks
1
Der angegebene ParameterPhoneNumber ist keine Zeichenfolge, sondern muss eine bereits analysierte Telefonnummer sein, in der die Standardregion generiert werden soll
Gil SH
@ GilSH ja gegebenPhoneNumber nicht String, Es ist PhoneNumber Objekt.
Thilina Rubasingha
1
Diese Antwort hilft mir
Luttu Android
Was ist gegebenPhoneNumber?
TharakaNirmana
3

Ich habe eine praktische Hilfsmethode, um dies zu beheben, basierend auf einer Antwort, die oben veröffentlicht wurde:

Importe:

import com.google.i18n.phonenumbers.NumberParseException
import com.google.i18n.phonenumbers.PhoneNumberUtil

Funktion:

    fun parseCountryCode( phoneNumberStr: String?): String {
        val phoneUtil = PhoneNumberUtil.getInstance()
        return try {
            // phone must begin with '+'
            val numberProto = phoneUtil.parse(phoneNumberStr, "")
            numberProto.countryCode.toString()
        } catch (e: NumberParseException) {
            ""
        }
    }
Ali Nawaz
quelle
0

Verwenden Sie einen Try-Catch-Block wie folgt:

try { 

const phoneNumber = this.phoneUtil.parseAndKeepRawInput(value, this.countryCode);

}catch(e){}
Soni Kumari
quelle
0

Hier ist eine Lösung, um das Land anhand einer internationalen Telefonnummer zu ermitteln, ohne die Google-Bibliothek zu verwenden.

Lassen Sie mich zunächst erklären, warum es so schwierig ist, das Land herauszufinden. Der Ländercode einiger Länder ist 1-stellig, 2, 3 oder 4-stellig. Das wäre einfach genug. Der Ländercode 1 wird jedoch nicht nur für die USA verwendet, sondern auch für Kanada und einige kleinere Orte:

1339 USA
1340 Jungferninseln (Karibikinseln)
1341 USA
1342 nicht verwendet
1343 Kanada

Die Ziffern 2..4 entscheiden, ob es sich um die USA oder Kanada handelt oder ... Es gibt keine einfache Möglichkeit, das Land herauszufinden, da die ersten xxx Kanada und die übrigen USA sind.

Für meinen Code habe ich eine Klasse definiert, die Informationen für jede Ziffer enthält:

public class DigitInfo {
  public char Digit;
  public Country? Country;
  public DigitInfo?[]? Digits;
}

Ein erstes Array enthält die DigitInfos für die erste Ziffer in der Nummer. Die zweite Ziffer wird als Index für DigitInfo.Digits verwendet. Man fährt die Ziffernkette entlang, bis die Ziffern leer sind. Wenn Land definiert ist (dh nicht null), wird dieser Wert zurückgegeben, andernfalls wird jedes zuvor definierte Land zurückgegeben:

country code 1: byPhone[1].Country is US  
country code 1236: byPhone[1].Digits[2].Digits[3].Digits[6].Country is Canada  
country code 1235: byPhone[1].Digits[2].Digits[3].Digits[5].Country is null. Since   
                   byPhone[1].Country is US, also 1235 is US, because no other   
                   country was found in the later digits

Hier ist die Methode, mit der das Land basierend auf der Telefonnummer zurückgegeben wird:

/// <summary>
/// Returns the Country based on an international dialing code.
/// </summary>
public static Country? GetCountry(ReadOnlySpan<char> phoneNumber) {
  if (phoneNumber.Length==0) return null;

  var isFirstDigit = true;
  DigitInfo? digitInfo = null;
  Country? country = null;
  foreach (var digitChar in phoneNumber) {
    var digitIndex = digitChar - '0';
    if (isFirstDigit) {
      isFirstDigit = false;
      digitInfo = ByPhone[digitIndex];
    } else {
      if (digitInfo!.Digits is null) return country;

      digitInfo = digitInfo.Digits[digitIndex];
    }
    if (digitInfo is null) return country;

    country = digitInfo.Country??country;
  }
  return country;
}

Der Rest des Codes (digitInfos für jedes Land der Welt, Testcode, ...) ist zu groß, um hier veröffentlicht zu werden. Er ist jedoch auf Github zu finden: https://github.com/PeterHuberSg/WpfWindowsLib/blob /master/WpfWindowsLib/CountryCode.cs

Der Code ist Teil einer WPF-Textbox und die Bibliothek enthält auch andere Steuerelemente für E-Mail-Adressen usw. Eine detailliertere Beschreibung finden Sie in CodeProject: Internationale Telefonnummernvalidierung im Detail erklärt

Peter Huber
quelle
-5

Wenn die Zeichenfolge mit der Telefonnummer immer auf diese Weise beginnt (+33 oder eine andere Landesvorwahl), sollten Sie Regex verwenden, um die Landesvorwahl zu analysieren und abzurufen, und dann die Bibliothek verwenden, um das der Nummer zugeordnete Land abzurufen.

yjajkiew
quelle
Es gibt viele verschiedene Ländercodes: http://en.wikipedia.org/wiki/List_of_country_calling_codes
mrroboaat
-24

Hier ist eine Antwort, wie Sie den Ländercode finden, ohne Bibliotheken von Drittanbietern zu verwenden (wie es ein echter Entwickler tut):

Hier finden Sie eine Liste aller verfügbaren Ländercodes. Wikipedia kann hier helfen: https://en.wikipedia.org/wiki/List_of_country_calling_codes

Analysieren Sie Daten in einer Baumstruktur, in der jede Ziffer ein Zweig ist.

Durchqueren Sie Ihren Baum Ziffer für Ziffer, bis Sie zum letzten Zweig gelangen - das ist Ihre Landesvorwahl.

Unobisch
quelle
24
Ich stimme dies aufgrund dieses Kommentars ab: "Hier ist eine Antwort, wie man Länderanrufcodes findet, ohne Bibliotheken von Drittanbietern zu verwenden (wie es echte Entwickler tun):" Warum macht Software Ihrer Meinung nach Fortschritte? Das liegt daran, dass die Leute das Rad nicht jedes Mal neu erfinden müssen. Ein REAL-Entwickler verwendet Bibliotheken von Drittanbietern, weil er schlau ist.
Carl B
2
Ihre persönliche Meinung macht meine Antwort nicht falsch, oder? Tatsächlich ist dies die einzige richtige und kugelsichere Antwort ... und ja, es ist keine Software von Drittanbietern erforderlich, um zu funktionieren. Sie können meine Lösung gerne kaufen, wenn Sie darauf bestehen, Bibliotheken von Drittanbietern zu verwenden.
Unobisch
2
Das Aktualisieren einer Bibliothek ist einfacher als das ständige Aufrufen einer Wikipedia-Seite, um zu überprüfen, ob sich die Liste der Länderanrufcodes geändert hat.
Flimm
@Unobic Sorry Mann. Sie sollten nicht wegen persönlicher Meinung zu Stackoverflow abstimmen. Ich habe bei der Suche genau nach Ihrer Antwort gesucht. Also danke von mir. Habe wenigstens meine Gegenstimme.
Ybrin