86

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

如果我知道国家,很酷我可以找到国家代码:

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

但我找不到在不知道国家/地区的情况下解析字符串的方法。

4

7 回答 7

136

好的,所以我加入了 libphonenumber 的 google 组(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());
}
于 2013-05-30T11:46:08.770 回答
4

根据上面发布的一个答案,我保留了一种方便的辅助方法来处理这个问题:

进口:

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) {
            ""
        }
    }
于 2019-07-02T13:52:21.743 回答
3

在这里您可以将电话号码保存为国际格式的电话号码

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

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

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

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

希望对你有帮助

于 2013-05-30T07:55:54.870 回答
0

使用如下所示的 try catch 块:

try { 

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

}catch(e){}
于 2020-04-10T13:12:49.943 回答
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;
}

其余代码(世界各国的数字信息,测试代码,...)太大,无法在此处发布,但可以在 Github 上找到: https ://github.com/PeterHuberSg/WpfWindowsLib/blob /master/WpfWindowsLib/CountryCode.cs

该代码是 WPF 文本框的一部分,该库还包含用于电子邮件地址等的其他控件。更详细的描述在 CodeProject:国际电话号码验证详细解释

于 2020-04-11T13:14:19.533 回答
-5

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

于 2013-05-29T09:17:00.313 回答
-25

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

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

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

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

于 2016-07-12T15:27:26.177 回答