전화 번호 [libphonenumber]에서 코드 국가 추출


82

다음과 같은 문자열이 있습니다. +33123456789 (프랑스어 전화 번호). 국가를 모르고 국가 코드 (+33)를 추출하고 싶습니다. 예를 들어 다른 국가의 다른 전화가 있으면 작동합니다. Google 라이브러리 https://code.google.com/p/libphonenumber/를 사용합니다 .

내가 국가를 안다면 국가 코드를 찾을 수 있다는 것이 멋지다.

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

하지만 국가를 모르고 문자열을 구문 분석하는 방법을 찾지 못했습니다.




1
첫 번째 링크는 전화 국가 코드를 기반으로합니다. 하지만 제 경우에는 영어 전화로 프랑스 전화 번호 인 문자열을 가질 수 있습니다. 내가 현재 로케일을 검색한다면, 나는 "EN"가하지만 내 캐릭터 라인은 프랑스 국가 코드가 될 것이다
mrroboaat

답변:


128

좋아, 그래서 나는 libphonenumber의 구글 그룹 ( https://groups.google.com/forum/?hl=ko&fromgroups#!forum/libphonenumber-discuss )에 가입했고 질문을했습니다.

전화 번호가 "+"로 시작하면 매개 변수에서 국가를 설정할 필요가 없습니다. 다음은 예입니다.

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
이 wackadoo 미친 라이브러리는 놀라운이며, 억 배 더 포함 PhoneNumberUtil의보다 s라이브러리 안드로이드에서
에이펙스

@aat (phoneUtil.parse (phone, "");)에서 countryISOCode를 사용하지 않고 어떻게 작동하는지 알려 주시겠습니까? 답변 해주십시오
Ash

1
당신은 질문이있는 경우에는 @Shweta는 SO에 새 스레드에 게시하시기 바랍니다
mrroboaat

1
@aat 괜찮습니다.하지만 귀하의 대답은 정확하지 않습니다. countryISOCode를 제공하지 않으면이 코드가 실행되지 않습니다
Ash

3
@Schweta defaultRegion 매개 변수는 null이어야합니다. defaultRegion-숫자가 나올 것으로 예상되는 지역을 나타내는 ISO 3166-1 두 자리 지역 코드입니다. 이것은 구문 분석되는 숫자가 국제 형식으로 작성되지 않은 경우에만 사용됩니다. 이 경우 번호의 country_code는 제공된 기본 지역의 코드로 저장됩니다. 번호가 '+'로 시작하고 국가 전화 코드가 오는 것이 보장되는 경우 "ZZ"또는 null을 제공 할 수 있습니다.
xnagyg

3

여기에서 전화 번호를 국제 형식의 전화 번호로 저장할 수 있습니다.

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

국제 형식으로 전화 번호를 반환합니다. +94 71560 4888

그래서 이제 국가 코드를 얻었습니다.

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

이것이 당신을 도울 수 있기를 바랍니다


1
internationalFormatPhoneNumberDataType 및 phoneUtil이란 무엇 입니까
Kartheek s

1
givenPhoneNumber 매개 변수는 문자열이 아닙니다. witch에서 이미 구문 분석 된 전화 번호 여야합니다. 생성하려면 기본 지역이 필요합니다.
Gil SH

@GilSH 예 givenPhoneNumber는 String이 아닙니다. PhoneNumber 객체입니다.
Thilina Rubasingha 2014

1
이 대답은 나를 위해 도움이됩니다
luttu android

givenPhoneNumber는 무엇입니까 ??
TharakaNirmana

3

위에 게시 된 한 가지 답변을 기반으로이 문제를 처리하는 편리한 도우미 메서드를 유지했습니다.

수입품 :

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

함수:

    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

아래와 같이 try catch 블록을 사용하십시오.

try { 

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

}catch(e){}

0

다음은 Google 라이브러리를 사용하지 않고 국제 전화 번호로 국가를 가져 오는 솔루션입니다.

먼저 나라를 파악하는 것이 왜 그렇게 어려운지 설명하겠습니다. 소수 국가의 국가 코드는 1 자리, 2, 3 또는 4 자리입니다. 그것은 충분히 간단합니다. 그러나 국가 코드 1은 미국뿐만 아니라 캐나다 및 일부 소규모 지역에도 사용됩니다.

1339 USA
1340 Virgin Islands (Caribbean Islands)
1341 USA
1342 not used
1343 Canada

숫자 2..4는 그것이 미국인지 캐나다인지를 결정합니다. 첫 번째 xxx는 캐나다이고 나머지는 미국인 것처럼 국가를 알아내는 쉬운 방법은 없습니다.

내 코드의 경우 숫자에 대한 정보를 보유하는 클래스를 정의했습니다.

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

첫 번째 배열은 숫자의 첫 번째 숫자에 대한 DigitInfo를 보유합니다. 두 번째 숫자는 DigitInfo.Digits에 대한 인덱스로 사용됩니다. 하나는 Digits가 비어있을 때까지 해당 Digits 체인 아래로 이동합니다. Country가 정의 된 경우 (즉, null이 아님) 해당 값이 반환되고, 그렇지 않으면 이전에 정의 된 모든 국가가 반환됩니다.

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

전화 번호를 기준으로 국가를 반환하는 방법은 다음과 같습니다.

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

나머지 코드 (전 세계 모든 국가에 대한 DigitInfos, 테스트 코드 등)는 너무 커서 여기에 게시 할 수 없지만 Github에서 찾을 수 있습니다. https://github.com/PeterHuberSg/WpfWindowsLib/blob /master/WpfWindowsLib/CountryCode.cs

코드는 WPF TextBox의 일부이며 라이브러리에는 이메일 주소 등에 대한 다른 컨트롤도 포함되어 있습니다. 자세한 설명은 CodeProject에 있습니다. 국제 전화 번호 유효성 검사는 자세히 설명합니다.



-24

다음은 타사 라이브러리를 사용하지 않고 국가 전화 코드를 찾는 방법입니다 (실제 개발자처럼).

사용 가능한 모든 국가 코드 목록을 얻으십시오. Wikipedia는 여기에서 도움을 줄 수 있습니다 : https://en.wikipedia.org/wiki/List_of_country_calling_codes

각 숫자가 분기 인 트리 구조의 데이터를 구문 분석합니다.

마지막 지점에 도달 할 때까지 숫자로 트리 숫자를 이동하십시오. 이것이 국가 코드입니다.


26
나는 다음과 같은 코멘트로 인해 반대표를 던집니다. "여기에 타사 라이브러리를 사용하지 않고 국가 전화 코드를 찾는 방법이 있습니다 (실제 개발자가하는 것처럼) :"소프트웨어가 왜 발전한다고 생각합니까? 사람들이 매번 바퀴를 재발 명 할 필요가 없기 때문입니다. REAL 개발자는 똑똑하기 때문에 타사 라이브러리를 사용합니다.
Carl B

2
당신의 개인적인 의견이 내 대답을 틀리게하지 않습니까? 사실, 이것은 지금까지 유일하게 정확하고 방탄이되는 대답입니다. 그리고 예, 작동하기 위해 타사 소프트웨어가 필요하지 않습니다. 타사 라이브러리 사용을 고집하는 경우 내 솔루션을 구입하실 수 있습니다.
Unobic 2017-06-20

2
라이브러리를 업데이트하는 것은 Wikipedia 페이지로 이동하여 국가 전화 코드 목록이 변경되었는지 확인하는 것보다 쉽습니다.
Flimm

@Unobic 죄송합니다. Stackoverflow에 대한 개인적인 의견 때문에 투표해서는 안됩니다. 나는 검색 할 때 당신의 대답을 정확히 찾고있었습니다. 그래서 감사합니다. 적어도 내 찬성표를 받으십시오.
Ybrin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.