Mam taki ciąg znaków: +33123456789 (francuski numer telefonu). Chcę wyodrębnić kod kraju (+33) bez znajomości kraju. Na przykład powinno działać, jeśli mam inny telefon z innego kraju. Korzystam z biblioteki Google https://code.google.com/p/libphonenumber/ .
Jeśli znam kraj, to fajnie mogę znaleźć kod kraju:
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
int countryCode = phoneUtil.getCountryCodeForRegion(locale.getCountry());
ale nie znajduję sposobu na przeanalizowanie łańcucha bez znajomości kraju.
android
libphonenumber
mrroboaat
źródło
źródło
Odpowiedzi:
OK, więc dołączyłem do grupy google libphonenumber ( https://groups.google.com/forum/?hl=en&fromgroups#!forum/libphonenumber-discuss ) i zadałem pytanie.
Nie muszę ustawiać kraju w parametrze, jeśli mój numer telefonu zaczyna się od „+”. Oto przykład :
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()); }
źródło
s
biblioteka PhoneNumberUtil w systemie AndroidTutaj możesz zapisać numer telefonu jako numer telefonu w formacie międzynarodowym
internationalFormatPhoneNumber = phoneUtil.format(givenPhoneNumber, PhoneNumberFormat.INTERNATIONAL);
Zwróci numer telefonu w formacie międzynarodowym +94 71560 4888
więc teraz otrzymałem kod kraju jako ten
String countryCode = internationalFormatPhoneNumber.substring(0,internationalFormatPhoneNumber.indexOf('')).replace('+', ' ').trim();
Mam nadzieję, że to ci pomoże
źródło
internationalFormatPhoneNumber
DataType i phoneUtilMam poręczną metodę pomocniczą, aby zająć się tym w oparciu o jedną odpowiedź zamieszczoną powyżej:
Import:
import com.google.i18n.phonenumbers.NumberParseException import com.google.i18n.phonenumbers.PhoneNumberUtil
Funkcjonować:
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) { "" } }
źródło
Użyj bloku try catch jak poniżej:
try { const phoneNumber = this.phoneUtil.parseAndKeepRawInput(value, this.countryCode); }catch(e){}
źródło
Oto rozwiązanie pozwalające uzyskać kraj na podstawie międzynarodowego numeru telefonu bez korzystania z biblioteki Google.
Pozwólcie, że najpierw wyjaśnię, dlaczego tak trudno jest ustalić kraj. Kod kilku krajów składa się z 1 cyfry, 2, 3 lub 4 cyfr. To byłoby dość proste. Ale kod kraju 1 jest używany nie tylko dla Stanów Zjednoczonych, ale także dla Kanady i niektórych mniejszych miejsc:
1339 USA
1340 Wyspy Dziewicze (Wyspy Karaibskie)
1341 USA
1342 nieużywane
1343 Kanada
Cyfry od 2 do 4 decydują, czy są to Stany Zjednoczone czy Kanada, czy ... Nie ma łatwego sposobu na określenie kraju, tak jak pierwsze xxx to Kanada, a reszta to Stany Zjednoczone.
Dla mojego kodu zdefiniowałem klasę, która przechowuje informacje na zawsze:
public class DigitInfo { public char Digit; public Country? Country; public DigitInfo?[]? Digits; }
Pierwsza tablica zawiera DigitInfos jako pierwszą cyfrę w liczbie. Druga cyfra jest używana jako indeks w DigitInfo.Digits. Jedna podróżuje w dół łańcucha cyfr, aż cyfry są puste. Jeśli zdefiniowano Country (tj. Nie jest to null), wartość zostanie zwrócona, w przeciwnym razie każdy kraj zdefiniowany wcześniej zostanie zwrócony:
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
Oto metoda, która zwraca kraj na podstawie numeru telefonu:
/// <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; }
Reszta kodu (digitInfos dla każdego kraju na świecie, kod testowy, ...) jest zbyt duża, aby umieścić ją tutaj, ale można ją znaleźć na Github: https://github.com/PeterHuberSg/WpfWindowsLib/blob /master/WpfWindowsLib/CountryCode.cs
Kod jest częścią WPF TextBox, a biblioteka zawiera również inne kontrolki dla adresów e-mail itp. Bardziej szczegółowy opis znajduje się w CodeProject: Szczegółowy opis weryfikacji międzynarodowego numeru telefonu
źródło
Jeśli ciąg znaków zawierający numer telefonu będzie zawsze zaczynał się w ten sposób (+33 lub inny kod kraju), powinieneś użyć wyrażenia regularnego, aby przeanalizować i uzyskać kod kraju, a następnie skorzystać z biblioteki, aby uzyskać kraj powiązany z numerem.
źródło
Oto odpowiedź, jak znaleźć numer kierunkowy kraju bez korzystania z bibliotek innych firm (tak jak robi to prawdziwy programista):
Uzyskaj listę wszystkich dostępnych kodów krajów, Wikipedia może pomóc tutaj: https://en.wikipedia.org/wiki/List_of_country_calling_codes
Analizuj dane w strukturze drzewa, w której każda cyfra jest gałęzią.
Przeszukuj drzewo cyfra po cyfrze, aż znajdziesz się na ostatniej gałęzi - to twój kod kraju.
źródło