从电话号码[libphonenumber]中提取代码国家/地区

时间:2013-05-29 08:55:07

标签: android libphonenumber

我有一个这样的字符串:+33123456789(法语电话号码)。我想在不知道国家的情况下提取国家代码(+33)。例如,如果我有来自其他国家的另一部电话,它应该可以工作。我使用谷歌库https://code.google.com/p/libphonenumber/

如果我了解这个国家,我很酷,我可以找到国家代码:

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

但我找不到解析字符串而不知道国家的方法。

8 个答案:

答案 0 :(得分:109)

好的,所以我加入了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());
}

答案 1 :(得分:1)

在此处,您可以将电话号码保存为国际格式的电话号码

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

它将电话号码返回为 国际格式+94 71 560 4888

所以现在我得到了国家代码

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

希望这会对你有所帮助

答案 2 :(得分:0)

我们的一位客户遇到了类似的问题,并非他们的所有电话号码都以“ +”开头。但是仍然经常可以根据电话号码格式来猜测国家/地区,例如06 XX XX XX XX看起来像是法国的手机号码。可能还有别的东西,但是它试图验证一个法语数字并查看libphonenumber是否可以肯定地进行验证。

此客户还使用联系人的姓名(可能是原籍国)来尝试确定要验证的国家/地区的优先级。例如,使用意大利名称,他们将尝试验证意大利电话号码。

我们已将国家/地区代码检测功能添加到libphonenumber中,并制作了一个免费的API,该API结合了个人姓名以及电话号码格式(前缀,多少个数字,多少个空格,是否有破折号或括号)等)

可以在https://apiphonenumber.com/在线试用

它可以使用以“ +”开头的数字,但是在95%的时间中,它也可以使用其他本地格式化的数字。

答案 3 :(得分:0)

根据上面发布的一个答案,我有一个方便的助手方法来解决此问题:

进口:

fileutils

功能:

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

答案 4 :(得分:0)

使用如下所示的try catch块:

try { 

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

}catch(e){}

答案 5 :(得分: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;
}

第一个数组保存数字中第一个数字的DigitInfos。第二个数字用作DigitInfo.Digits的索引。一个人沿着该Digits链向下移动,直到Digits为空。如果定义了Country(即不为null),则返回该值,否则返回先前定义的任何Country:

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文本框的一部分,该库还包含其他用于电子邮件地址的控件,等等。有关详细信息,请参见CodeProject:International Phone Number Validation Explained in Detail

答案 6 :(得分:-4)

如果包含电话号码的字符串始终以这种方式开始(+33或其他国家/地区代码),您应该使用正则表达式来解析并获取国家/地区代码,然后使用该库来获取与该号码相关联的国家/地区。

答案 7 :(得分:-21)

以下是如何在不使用第三方库的情况下查找国家/地区呼叫代码的答案(正如真正的开发人员所做的那样):

获取所有可用国家/地区代码的列表,维基百科可以在此处提供帮助: https://en.wikipedia.org/wiki/List_of_country_calling_codes

在树结构中解析数据,其中每个数字都是分支。

逐个遍历您的树,直到您到达最后一个分支 - 这是您的国家/地区代码。