8

「919638095998」番号のような国番号の携帯電話番号のリストがあります。libphonenumber googleの例も参照しましたが、最初に国の2桁のコードを渡す必要がありますが、これは最初はわかりません。では、その番号がどの国からのものであるかをどうやって知ることができますか?

また、携帯電話番号から1桁ずつ手動でコードを抽出し、国コードと比較するという1つの解決策もあります。しかし、それは長い作業であり、またそれは私に悪いパフォーマンスを与えるでしょう。誰かが適切な解決策を提案できますか?

4

9 に答える 9

10

libphonenumberはあなたのためにそれを行います。電話番号の前に記号を追加し、+電話番号を解析するときに国コードを省略するだけです。

String numberStr = "+919638095998";
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
try {
    Phonenumber.PhoneNumber numberProto = phoneUtil.parse(numberStr, "");

    System.out.println("Country code: " + numberProto.getCountryCode());
    //This prints "Country code: 91"
} catch (NumberParseException e) {
    System.err.println("NumberParseException was thrown: " + e.toString());
}
于 2017-03-23T17:49:49.933 に答える
7

ウィキペディアには、国番号に使用できるすべての電話番号のリストがあります。ここにあるよ

http://en.wikipedia.org/wiki/List_of_country_calling_codes

2つのハッシュマップを作成します。1つは4桁のコードすべてを含み、もう1つは2桁と3桁のコードの両方を含みます。

Hashmap fourdigitcodes;

//check if first digit is 7
if(firstdigit==7)
  //country definitely russia
else
   if country code begins with 1.
     Check the first four digits are in the hashmap with four digit codes and return the value 
     if no value is found then answer is certainly usa.
otherwise
     String country="";
     HashMap<String,String> ccode = new HashMap<String,String>();
     ccode.put("353","Ireland");//List all country codes
     ccode.put("49","Germany");
     String value = ccode.get("49");//See if I have a value for the first 2 digits
     if(value != null){
      country = value; //If I found a country for the first two digits we are done as the              first two digits of the country code consisting of two digits cannot be in a country code with 3
     }else{
      the country is certainly 3 digit. return the first three digits by entering the first 3 digits as the key of the hashmap countaining the first three digits. 
     }

要約すれば。最初の桁が7ロシア語の場合。1の場合、最初の4つの数字の4桁のコードのハッシュマップをチェックします。4桁のコードが見つかった場合は、対応する国を返します。答えが米国でない場合は、2桁または3桁を含むハッシュマップの最初の2桁をチェックします。2つ見つかった場合は、他の答えを返します。それは確かに3桁のコードであり、ハッシュから対応する国を返します。

ハッシュマップを作成するのは面倒ですが、効率的な解決策だと思います。

于 2012-09-04T08:36:48.457 に答える
2
The below code will extract the country code from any given phone number, the logic is implemented based on. https://en.wikipedia.org/wiki/List_of_country_calling_codes
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

    /**
     * @author swapna * This class will fetch the country code from the incoming
     *         phone number with format <+><CTRY CODE><Phone Number> based on the
     *         data from https://en.wikipedia.org/wiki/List_of_country_calling_codes
     *
     */
    public enum PhoneNumberNCtryCode {
        Instance;

        private List<Integer> forCtryCodePrefix1 = new ArrayList<Integer>();
        @SuppressWarnings("serial")
        List<Integer> forCtryCodePrefix2 = new ArrayList<Integer>() {
            {
                add(0);
                add(7);
                add(8);

            }
        };
        @SuppressWarnings("serial")
        private List<Integer> forCtryCodePrefix3 = new ArrayList<Integer>() {
            {
                add(0);
                add(1);
                add(2);
                add(3);
                add(4);
                add(6);
                add(9);
            }
        };
        @SuppressWarnings("serial")
        private List<Integer> forCtryCodePrefix4 = new ArrayList<Integer>() {
            {
                add(0);
                add(1);
                add(3);
                add(4);
                add(5);
                add(6);
                add(7);
                add(8);
                add(9);
            }
        };
        @SuppressWarnings("serial")
        private List<Integer> forCtryCodePrefix5 = new ArrayList<Integer>() {
            {
                add(1);
                add(2);
                add(3);
                add(4);
                add(5);
                add(6);
                add(7);
                add(8);
            }
        };
        @SuppressWarnings("serial")
        private List<Integer> forCtryCodePrefix6 = new ArrayList<Integer>() {
            {
                add(0);
                add(1);
                add(3);
                add(4);
                add(5);
                add(6);

            }
        };
        private List<Integer> forCtryCodePrefix7 = new ArrayList<Integer>();
        @SuppressWarnings("serial")
        private List<Integer> forCtryCodePrefix8 = new ArrayList<Integer>() {
            {
                add(1);
                add(3);
                add(4);
                add(6);
                add(9);

            }
        };
        @SuppressWarnings("serial")
        private List<Integer> forCtryCodePrefix9 = new ArrayList<Integer>() {
            {
                add(1);
                add(2);
                add(3);
                add(4);
                add(5);
                add(8);
            }
        };
        @SuppressWarnings("serial")
        private Map<Integer, List<Integer>> countryCodeMap = new HashMap<Integer, List<Integer>>() {
            {
                put(1, forCtryCodePrefix1);
                put(2, forCtryCodePrefix2);
                put(3, forCtryCodePrefix3);
                put(4, forCtryCodePrefix4);
                put(5, forCtryCodePrefix5);
                put(6, forCtryCodePrefix6);
                put(7, forCtryCodePrefix7);
                put(8, forCtryCodePrefix8);
                put(9, forCtryCodePrefix9);

            }
        };

        /**
         * This method parses the phone number using the prefix Ctry Map
         * 
         * @param phoneNumber
         * @return
         */
        public int getCtryCode(String phoneNumber) {
            String ctryCodeAtIndex1 = phoneNumber.substring(1, 2);
            Integer ctryCode = 0;
            String ctryCodeStr = "0";

            List<Integer> ctryCodeList =        countryCodeMap.get(Integer.valueOf(ctryCodeAtIndex1));
            if (ctryCodeList.isEmpty()) {
                ctryCode = Integer.valueOf(ctryCodeAtIndex1);
                return ctryCode.intValue();
            }
            String ctryCodeAtIndex2 = phoneNumber.substring(2, 3);
            for (Integer ctryCodePrefix : ctryCodeList) {
                if (Integer.valueOf(ctryCodeAtIndex2) == ctryCodePrefix) {
                    ctryCodeStr = phoneNumber.substring(1, 3);
                    ctryCode = Integer.valueOf(ctryCodeStr);
                    return ctryCode.intValue();

                }
            }
            ctryCodeStr = phoneNumber.substring(1, 4);
            ctryCode = Integer.valueOf(ctryCodeStr);
            return ctryCode.intValue();
        }

    }
于 2018-02-21T05:39:01.360 に答える
1

遅くなければ

これを探しているだけで、Googleが管理しているJavaおよびJavascriptライブラリが見つかりました;)

リポジトリを参照してください: https ://github.com/googlei18n/libphonenumber

デモもあります。

幸運を!

于 2015-07-23T13:48:41.117 に答える
0

静的データ構造を使用することは悪い習慣と見なされるかもしれませんが、国コードはあまり変わらないので、それらのリストをツリーとして作成し、このツリーで数値を解析することは、実装が簡単なソリューションになるはずです。

国コードのリストを外部ファイルに入れて、アプリケーションコードを変更せずに簡単に更新できるようにすることもできます。

ウィキペディアには、ここに国コードのリストがあります。

于 2012-09-04T08:20:38.607 に答える
0

国番号が2桁の場合は番号。電話番号を2つに分割し、最初のサブストリングは2桁で、2番目のサブストリングは残りの10桁です。

于 2012-09-04T08:28:58.943 に答える
0

ウィキペディアから簡単なチェックを行うだけで、正面から最大文字列検索アルゴリズムを実行する必要があることがわかりました。競合は発生していないようですが、場合によっては、桁数(NSN)を確認して国コードを見つけることができます。

最適化された方法は、バケットを作成することです。国コードリストから。国コードの最大長は4です(州の精度を調べたい場合を除き、その場合は7になります。ゾーン6を確認してください)。次に、4、3、2、1から存在を確認します。これにより、検索アルゴリズムの時間が大幅に短縮されます。ただし、データサイズは大きくなります。時間と空間のトレードオフの典型的なケース

于 2012-09-04T08:30:00.033 に答える
0

独自のリンクを見ると、CountryCodeToRegionCodeMapクラスを見つけることができます。おそらくすべての国コードのリストが含まれています。これを使用して独自のコードを作成し、国コードの長さが1、2、または3であるかどうかを判断できます。インターネット上でこのようなリストを見つけることができるのはこれだけだとは思いません。

于 2012-09-04T08:30:28.133 に答える
0

モバイルの国コードは、+(plus)44、0044、44のように始まる場合があり、上記のように、一部の国では可変長コードが使用される場合があります。したがって、最善の解決策は、現在のところ、携帯電話番号の長さが10であることがわかっているので、最初からやり直すことです。これらの10桁を取得すると、それに応じて国コードを解析できます。

于 2012-09-04T08:48:16.533 に答える