電話番号からコードの国を抽出します[libphonenumber]


82

私はこのような文字列を持っています:+33123456789(フランス語の電話番号)。国を知らずに国コード(+33)を抽出したい。たとえば、別の国の別の電話がある場合は機能するはずです。私はグーグルライブラリhttps://code.google.com/p/libphonenumber/を使用しています

私が国を知っているなら、それは私が国コードを見つけることができるのはクールです:

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

しかし、国を知らずに文字列を解析する方法は見つかりません。




1
最初のリンクは、電話の国コードに基づいています。しかし、私の場合、英語の電話でフランス語の電話番号である文字列を持つことができます。したがって、現在のロケールを取得すると、「EN」が表示されますが、文字列はフランス語の国コードになります
mrroboaat 2013年

回答:


128

さて、私はlibphonenumberのグーグルグループ(https://groups.google.com/forum/?hl=en&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クレイジーライブラリは素晴らしくs、Androidに含まれているPhoneNumberUtilライブラリよりも10億倍優れています
Aphex

@aat(phoneUtil.parse(phone、 "");)でcountryISOCodeを使用せずにどのように機能するかを教えてください。回答してください
Ash

1
@Shweta質問がある場合は、SOの新しいスレッドに投稿してください
mrroboaat 2014年

1
@aatわかりましたが、countryISOCodeを指定しないと、このコードは実行されません
Ash

3
@SchwetadefaultRegionパラメーターはnullである必要があります。defaultRegion-番号の取得元となる地域を示すISO3166-1の2文字の地域コード。これは、解析される数値が国際形式で書かれていない場合にのみ使用されます。この場合の番号のcountry_codeは、指定されたデフォルトのリージョンのcountry_codeとして保存されます。番号が「+」で始まり、その後に国の市外局番が続くことが保証されている場合は、「ZZ」またはnullを指定できます。
xnagyg 2015年

3

ここでは、電話番号を国際形式の電話番号として保存できます

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

電話番号を国際形式で返します+9471 560 4888

だから今私はこのように国コードを取得しています

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

これがお役に立てば幸いです


1
何でinternationalFormatPhoneNumberデータ型とphoneUtil
Kartheek秒

1
与えられたPhoneNumberパラメータは文字列ではありません。生成するデフォルトの領域が必要な魔女ですでに解析された電話番号である必要があります
Gil SH

@GilSHはいgivenPhoneNumberは文字列ではなく、PhoneNumberオブジェクトです。
Thilina Rubasingha 2014

1
この答えは私に役立ちます
luttu android 2014

GivePhoneNumberとは何ですか?
TharakaNirmana 2016

3

私は上記の1つの回答に基づいて、これを処理するための便利なヘルパーメソッドを保持しています。

輸入:

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

以下のようなtrycatchブロックを使用します。

try { 

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

}catch(e){}

0

これは、Googleライブラリを使用せずに国際電話番号に基づいて国を取得するためのソリューションです。

まず、国を把握するのが難しい理由を説明しましょう。いくつかの国の国コードは1桁、2、3、または4桁です。それは十分に簡単でしょう。ただし、国コード1は米国だけでなく、カナダやその他の小規模な場所でも使用されます。

1339米国
1340バージン諸島(カリブ海諸島)
1341米国
1342未使用
1343カナダ

数字2..4は、それが米国かカナダかを決定します。最初のxxxはカナダ、残りは米国のように、国を把握する簡単な方法はありません。

私のコードでは、これまでの数字の情報を保持するクラスを定義しました。

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

最初の配列は、番号の最初の桁のDigitInfoを保持します。2桁目は、DigitInfo.Digitsへのインデックスとして使用されます。Digitsが空になるまで、そのDigitsチェーンを下に移動します。国が定義されている(つまり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

コードはWPFTextBoxの一部であり、ライブラリには電子メールアドレスなどの他のコントロールも含まれています。詳細については、CodeProject:International Phone Number Validation ExplainedinDetailを参照してください。


-5

電話番号を含む文字列が常にこのように始まる場合(+33または別の国コード)、正規表現を使用して国コードを解析および取得してから、ライブラリを使用して番号に関連付けられている国を取得する必要があります。


それは多くの異なる国コードが存在します:http
mrroboaat 2013年

-24

(実際の開発者が行うように)サードパーティのライブラリを使用せずに国の呼び出しコードを見つける方法の答えは次のとおりです。

利用可能なすべての国コードのリストを取得します。ウィキペディアはここで役立ちます:https//en.wikipedia.org/wiki/List_of_country_calling_codes

各桁がブランチであるツリー構造でデータを解析します。

最後のブランチに到達するまで、ツリーを1桁ずつトラバースします。これが国コードです。


26
私はこのコメントのためにこれに反対票を投じています:「サードパーティのライブラリを使用せずに国の呼び出しコードを見つける方法は次のとおりです(実際の開発者が行うように):」ソフトウェアが進歩すると思うのはなぜですか?それは、人々が毎回車輪の再発明をする必要がないからです。REAL開発者は、頭が良いのでサードパーティのライブラリを使用します。
カールB

2
あなたの個人的な意見は私の答えを間違ったものにしませんね?実際、これはこれまでのところ唯一の正解で防弾の答えです...そしてはい、それは動作するためにサードパーティのソフトウェアを必要としません。サードパーティのライブラリを使用することを主張する場合は、私のソリューションを購入してください。
Unobic 2017年

2
ライブラリの更新は、ウィキペディアのページに継続的にアクセスして、国の呼び出しコードのリストが変更されているかどうかを確認するよりも簡単です。
Flimm 2018年

@Unobicごめんなさい。Stackoverflowに関する個人的な意見があるため、投票しないでください。私は検索するときにあなたの答えを正確に探していました。だから私から感謝します。少なくとも私の賛成票を持ってください。
Ybrin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.