我有一个带有国家代码的手机号码列表,例如“919638095998”号码。我也提到了libphonenumber google 示例,但首先我们需要传递国家/地区的 2 位数代码,我最初并不知道。那么我怎么知道这个号码来自哪个国家呢?
我也有一种解决方案,即手动从手机号码中逐位提取代码,然后与国家代码进行比较。但这是一项漫长的任务,也会给我带来糟糕的表现。任何人都可以提出适当的解决方案吗?
我有一个带有国家代码的手机号码列表,例如“919638095998”号码。我也提到了libphonenumber google 示例,但首先我们需要传递国家/地区的 2 位数代码,我最初并不知道。那么我怎么知道这个号码来自哪个国家呢?
我也有一种解决方案,即手动从手机号码中逐位提取代码,然后与国家代码进行比较。但这是一项漫长的任务,也会给我带来糟糕的表现。任何人都可以提出适当的解决方案吗?
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());
}
维基百科上有一个国家代码可用的所有电话号码列表。是这里
http://en.wikipedia.org/wiki/List_of_country_calling_codes
我会创建两个哈希图。一个包含所有四位代码,一个包含两位和三位代码。
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,则在前四个数字的四位代码的哈希图中检查,如果找到四位代码,则返回相应的国家。如果没有回答是美国,否则检查包含 2 或 3 位数字的哈希图中的前两位。如果找到两个,则返回答案,否则肯定是一个三位数的代码,并从哈希中返回相应的国家/地区。
制作哈希图会很乏味,但我认为这是一个有效的解决方案。
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();
}
}
如果不晚
只是在寻找这个,我发现了一个由 Google 维护的 Java 和 Javascript 库;)
查看回购: https ://github.com/googlei18n/libphonenumber
还有一个演示。
祝你好运!
虽然使用静态数据结构可能被认为是不好的做法,但国家/地区代码变化不大,因此我认为将它们创建为一棵树并用这棵树解析数字应该是一个易于实施的解决方案。
您还可以将国家代码列表放在外部文件中,以便在不更改应用程序代码的情况下轻松更新它。
维基百科在这里有国家代码列表。
如果国家代码只有 2 位数字。将电话号码拆分为 2,第一个子字符串有 2 个数字,第二个子字符串有剩余的 10 个数字。
如果您查看自己的链接,您可以找到CountryCodeToRegionCodeMap 类。它包含可能所有国家/地区代码的列表。您可以使用它来创建自己的代码来确定国家代码的长度为 1、2 或 3。我不敢相信这是互联网上唯一可以找到此类列表的地方。
手机中的国家/地区代码有时以 +(plus)44、0044、44 开头,如上所述,某些国家/地区可能具有可变长度代码。所以最好的解决方案是从现在开始,我们知道手机号码的长度是 10。一旦你拿到这 10 位数字,你就可以相应地解析国家代码。