Wyodrębnij kod kraju z numeru telefonu [libphonenumber]


82

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.




1
Pierwszy link jest oparty na numerze kierunkowym kraju. Ale w moim przypadku mogę mieć ciąg znaków, który jest francuskim numerem telefonu z telefonem angielskim. Więc jeśli pobiorę bieżące ustawienia regionalne, będę miał „EN”, ale moim ciągiem będzie francuski kod kraju
mrroboaat

Odpowiedzi:


128

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());
}

6
ta szalona biblioteka wackadoo jest niesamowita i miliard razy lepsza niż dołączona sbiblioteka PhoneNumberUtil w systemie Android
Aphex

@aat, czy możesz mi powiedzieć, jak to będzie działać bez użycia kodu countryISOCode w (phoneUtil.parse (phone, "");) odpowiedź, odpowiedz
Ash

1
@Shweta Jeśli masz pytanie, napisz je w nowym wątku na SO
mrroboaat

1
@aat ok, ale twoja odpowiedź nie jest poprawna, bez podania żadnego countryISOCode ten kod nie zostanie wykonany
Ash

3
Parametr @Schweta defaultRegion powinien mieć wartość null: defaultRegion - dwuliterowy kod regionu ISO 3166-1 oznaczający region, z którego ma pochodzić numer. Jest to używane tylko wtedy, gdy analizowana liczba nie jest zapisana w formacie międzynarodowym. W tym przypadku kod_kraju dla numeru będzie przechowywany jako domyślny region. Jeśli numer ma zaczynać się od znaku „+”, po którym następuje numer kierunkowy kraju, można podać „ZZ” lub null.
xnagyg

3

Tutaj 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


1
co to jest internationalFormatPhoneNumberDataType i phoneUtil
Kartheek

1
parametr podanyPhoneNumber nie jest ciągiem znaków, musi to być już przeanalizowany numer telefonu, w którym musisz wygenerować region domyślny
Gil SH

@GilSH tak givenPhoneNumber nie String, jest to obiekt PhoneNumber.
Thilina Rubasingha,

1
ta odpowiedź mi pomaga
luttu android

co jest podaneNumer telefonu ??
TharakaNirmana

3

Mam 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) {
            ""
        }
    }

0

Użyj bloku try catch jak poniżej:

try { 

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

}catch(e){}

0

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



-24

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.


26
Głosuję w dół z powodu tego komentarza: „Oto odpowiedź, jak znaleźć kod kraju bez korzystania z bibliotek zewnętrznych (tak jak robi to prawdziwy programista):” Jak myślisz, dlaczego oprogramowanie robi postęp? Dzieje się tak, ponieważ ludzie nie muszą za każdym razem wymyślać koła na nowo. PRAWDZIWY programista korzysta z bibliotek innych firm, ponieważ jest inteligentny.
Carl B,

2
Twoja osobista opinia nie oznacza, że ​​moja odpowiedź jest nieprawidłowa, prawda? W rzeczywistości jest to jedyna jak dotąd poprawna i kuloodporna odpowiedź ... i tak, nie wymaga żadnego oprogramowania innych firm, aby działać. Zapraszamy do zakupu mojego rozwiązania, jeśli nalegasz na korzystanie z bibliotek innych firm.
Unobic

2
Aktualizowanie biblioteki jest łatwiejsze niż ciągłe wchodzenie na stronę Wikipedii w celu sprawdzenia, czy lista numerów kierunkowych krajów uległa zmianie.
Flimm

@ Unobic Sorry man. Nie powinni głosować z powodu osobistej opinii na temat Stackoverflow. Szukałem dokładnie Twojej odpowiedzi podczas wyszukiwania. Więc dzięki ode mnie. Miej przynajmniej moje poparcie.
Ybrin,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.