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

lqfhib0f  于 2023-01-24  发布在  Android
关注(0)|答案(7)|浏览(581)

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

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

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

bvhaajcl

bvhaajcl1#

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

chy5wohz2#

我已经得到了一个方便的助手方法来照顾这个基于上面张贴的一个答案:
进口:

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) {
            ""
        }
    }
tzcvj98z

tzcvj98z3#

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

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

它返回国际格式的电话号码+94 71 560 4888
所以现在我得到国家代码如下

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

希望这对你有帮助

d7v8vwbk

d7v8vwbk4#

这里有一个解决方案,以获得基于国际电话号码的国家,而不使用谷歌图书馆。
让我先解释一下为何国家这么难辨认,因为很少国家的国家代码是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。第二位用作DigitInfo. Digits的索引。沿着Digits链向下移动,直到Digits为空。如果定义了Country(即非空),则返回该值,否则返回之前定义的任何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/WpfWindowsHelperLib/CountryCode.cs
该代码是WPF TextBox的一部分,该库还包含用于电子邮件地址等的其他控件。CodeProject上有更详细的描述:International Phone Number Validation Explained in Detail

**更改23.1.23:**我将CountryCode.cs移到了WpfWindowsHelperLib,尽管它的名称是WPF,但它没有任何WPF依赖项。

fcg9iug3

fcg9iug35#

使用如下所示的try catch块:

try { 

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

}catch(e){}
dtcbnfnu

dtcbnfnu6#

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

toiithl6

toiithl67#

下面是如何不使用第三方库(像真实的的开发人员那样)找到国家调用代码的答案:
获取所有可用国家代码列表,Wikipedia可以在这里提供帮助:https://en.wikipedia.org/wiki/List_of_country_calling_codes
在树结构中解析数据,其中每个数字都是一个分支。
一个数字一个数字地遍历你的树,直到你在最后一个分支-这是你的国家代码。

相关问题