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.
android
libphonenumber
mrroboaat
quelle
quelle
Antworten:
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()); }
quelle
s
Bibliothek in AndroidHier 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
quelle
internationalFormatPhoneNumber
DataType und phoneUtilIch 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) { "" } }
quelle
Verwenden Sie einen Try-Catch-Block wie folgt:
try { const phoneNumber = this.phoneUtil.parseAndKeepRawInput(value, this.countryCode); }catch(e){}
quelle
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
quelle
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.
quelle
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.
quelle