Trích xuất mã quốc gia từ số điện thoại [libphonenumber]


81

Tôi có một chuỗi như thế này: +33123456789 (số điện thoại của Pháp). Tôi muốn trích xuất mã quốc gia (+33) mà không biết quốc gia đó. Ví dụ: nó sẽ hoạt động nếu tôi có một điện thoại khác từ quốc gia khác. Tôi sử dụng thư viện google https://code.google.com/p/libphonenumber/ .

Nếu tôi biết quốc gia, thật tuyệt, tôi có thể tìm thấy mã quốc gia:

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

nhưng tôi không tìm ra cách phân tích cú pháp một chuỗi mà không biết quốc gia.




1
Liên kết đầu tiên dựa trên mã quốc gia của điện thoại. Nhưng trong trường hợp của tôi, tôi có thể có một chuỗi là số điện thoại Pháp với điện thoại tiếng Anh. Vì vậy, nếu tôi truy xuất ngôn ngữ hiện tại, tôi sẽ có "EN" nhưng chuỗi của tôi sẽ là mã quốc gia Pháp
mrroboaat

Câu trả lời:


127

Được rồi, tôi đã tham gia nhóm google của libphonenumber ( https://groups.google.com/forum/?hl=vi&fromgroups#!forum/libphonenumber-discuss ) và tôi đã đặt một câu hỏi.

Tôi không cần đặt quốc gia trong tham số nếu số điện thoại của tôi bắt đầu bằng "+". Đây là một ví dụ :

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
thư viện điên wackadoo này là tuyệt vời và là tốt hơn một tỉ lần so với PhoneNumberUtil bao gồm sthư viện trong android
Aphex

@aat bạn sẽ cho tôi biết nó sẽ hoạt động như thế nào nếu không sử dụng mã quốc giaISOCode trong (phoneUtil.parse (phone, "");) câu trả lời của bạn, vui lòng phản hồi
Ash

1
@Shweta Nếu bạn có câu hỏi, vui lòng đăng câu hỏi đó trên một chủ đề mới trên SO
mrroboaat

1
@aat ok, nhưng câu trả lời của bạn không chính xác, nếu không cung cấp bất kỳ mã quốc gia nào thì mã này sẽ không thực thi
Ash

3
Tham số @Schweta defaultRegion phải là null: defaultRegion - mã vùng gồm hai chữ cái theo tiêu chuẩn ISO 3166-1 biểu thị vùng mà chúng tôi mong đợi số đến từ đó. Điều này chỉ được sử dụng nếu số đang được phân tích cú pháp không được viết ở định dạng quốc tế. Mã quốc gia cho số trong trường hợp này sẽ được lưu trữ dưới dạng mã vùng mặc định được cung cấp. Nếu số được đảm bảo bắt đầu bằng dấu '+' theo sau là mã gọi quốc gia thì có thể cung cấp "ZZ" hoặc null.
xnagyg

3

Tại đây, bạn có thể lưu số điện thoại dưới dạng số điện thoại định dạng quốc tế

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

nó trả về số điện thoại ở định dạng Quốc tế +94 71 560 4888

vì vậy bây giờ tôi đã nhận được mã quốc gia như thế này

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

Hy vọng điều này sẽ giúp bạn


1
là những gì internationalFormatPhoneNumberDataType và phoneUtil
Kartheek s

1
tham sốPhoneNumber đã cho không phải là một chuỗi, nó phải là một số điện thoại đã được phân tích cú pháp trong phù thủy, bạn cần vùng mặc định để tạo
Gil SH

@GilSH có choPhoneNumber không phải là String, nó là đối tượng PhoneNumber.
Thilina Rubasingha

1
câu trả lời này giúp ích cho tôi
luttu android

Số điện thoại được cung cấp là gì ??
TharakaNirmana

3

Tôi đã giữ một phương pháp trợ giúp hữu ích để xử lý vấn đề này dựa trên một câu trả lời được đăng ở trên:

Nhập khẩu:

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

Chức năng:

    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

Sử dụng một khối thử bắt như dưới đây:

try { 

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

}catch(e){}

0

Đây là một giải pháp để lấy quốc gia dựa trên số điện thoại quốc tế mà không cần sử dụng thư viện Google.

Đầu tiên hãy để tôi giải thích lý do tại sao rất khó để tìm ra đất nước. Mã quốc gia của một số quốc gia là 1 chữ số, 2, 3 hoặc 4 chữ số. Điều đó sẽ đủ đơn giản. Nhưng mã quốc gia 1 không chỉ được sử dụng cho Hoa Kỳ mà còn cho Canada và một số nơi nhỏ hơn:

1339 Hoa Kỳ
1340 Quần đảo Virgin (Quần đảo Caribe)
1341 Hoa Kỳ
1342 không được sử dụng
1343 Canada

Các chữ số 2..4 quyết định, nếu đó là Hoa Kỳ hay Canada hoặc ... Không có cách nào dễ dàng để tìm ra quốc gia, như xxx đầu tiên là Canada, phần còn lại là Hoa Kỳ.

Đối với mã của tôi, tôi đã xác định một lớp chứa thông tin cho từng chữ số:

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

Mảng đầu tiên chứa DigitInfos cho chữ số đầu tiên trong số. Chữ số thứ hai được dùng làm chỉ mục cho DigitInfo.Digits. Một người đi xuống chuỗi Chữ số đó, cho đến khi Chữ số trống. Nếu Quốc gia được xác định (tức là không null) thì giá trị đó sẽ được trả về, nếu không thì bất kỳ Quốc gia nào được xác định trước đó sẽ được trả về:

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

Đây là phương pháp trả về quốc gia dựa trên số điện thoại:

/// <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;
}

Phần còn lại của mã (digitInfos cho mọi quốc gia trên thế giới, mã kiểm tra, ...) quá lớn để đăng ở đây, nhưng bạn có thể tìm thấy nó trên Github: https://github.com/PeterHuberSg/WpfWindowsLib/blob /master/WpfWindowsLib/CountryCode.cs

Mã là một phần của WPF TextBox và thư viện cũng chứa các điều khiển khác cho địa chỉ email, v.v. Mô tả chi tiết hơn có trên CodeProject: Giải thích xác thực số điện thoại quốc tế trong chi tiết


-5

Nếu chuỗi chứa số điện thoại sẽ luôn bắt đầu theo cách này (+33 hoặc mã quốc gia khác), bạn nên sử dụng regex để phân tích cú pháp và lấy mã quốc gia, sau đó sử dụng thư viện để lấy quốc gia được liên kết với số.


Nó tồn tại rất nhiều mã quốc gia khác nhau: http://en.wikipedia.org/wiki/List_of_country_calling_codes
mrroboaat

-24

Đây là câu trả lời về cách tìm mã gọi quốc gia mà không cần sử dụng thư viện của bên thứ ba (như nhà phát triển thực sự làm):

Nhận danh sách tất cả các mã quốc gia có sẵn, Wikipedia có thể trợ giúp tại đây: https://en.wikipedia.org/wiki/List_of_country_calling_codes

Phân tích cú pháp dữ liệu trong cấu trúc cây trong đó mỗi chữ số là một nhánh.

Duyệt chữ số cây của bạn theo chữ số cho đến khi bạn ở chi nhánh cuối cùng - đó là mã quốc gia của bạn.


25
Tôi không bỏ phiếu vì nhận xét này: "Đây là câu trả lời về cách tìm mã gọi quốc gia mà không cần sử dụng thư viện của bên thứ ba (như nhà phát triển thực sự làm):" Tại sao bạn nghĩ phần mềm có tiến bộ? Đó là bởi vì mọi người không phải phát minh lại bánh xe mỗi lần. Một nhà phát triển THỰC sử dụng thư viện của bên thứ ba vì anh ấy / cô ấy thông minh.
Carl B

2
Ý kiến ​​cá nhân của bạn không làm cho câu trả lời của tôi không chính xác, phải không? Trên thực tế, đây là câu trả lời chính xác duy nhất cho đến nay ... và vâng, nó không yêu cầu bất kỳ phần mềm bên thứ 3 nào để hoạt động. Bạn có thể mua giải pháp của tôi nếu bạn khăng khăng sử dụng thư viện của bên thứ ba.
Unobic

2
Cập nhật thư viện dễ dàng hơn so với việc liên tục vào trang Wikipedia để kiểm tra xem danh sách các mã gọi quốc gia có thay đổi hay không.
Flimm

@Unobic Xin lỗi anh bạn. Họ không nên bỏ phiếu vì ý kiến ​​cá nhân trên Stackoverflow. Tôi đã tìm kiếm chính xác câu trả lời của bạn khi tìm kiếm. Vì vậy, cảm ơn từ tôi. Có ít nhất là ủng hộ của tôi.
Ybrin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.