当前位置: 首页 > 知识库问答 >
问题:

libphonenumber-在不知道国家/地区代码的情况下格式化电话号码

翟凯
2023-03-14

我从一个看起来很棒的图书馆听到了很多好消息,但我发现自己处于微妙的境地。

这是我工作过的第一个将电话号码存储在数据库中的项目。

我读过一些关于E.164格式的书,我确实打算用这种格式在我的数据库中存储所有电话号码。

我面临的问题是数据源。我无法控制数据源。我只知道我收到了一堆电话号码,它们的格式不一致。有些有国际延伸,有些没有。有些有括号、连字符、前导0等。有些没有。

我如何可能从上述来源提取电话号码,将其格式化为E.164,以便安全存储?

我尝试使用PhoneNumberUtil#parse()方法,但没有提供国家代码,因为我无法访问这些信息。

请看以下示例:

System.out.printLn("Number -> " + phoneNumberUtil.parse("00336555233634", null).toString())

错误类型:无效的国家/地区代码。缺少或无效的默认区域。

在我的例子中,号码是法国手机的号码。我相信,如果你从法国以外的地方拨号,这两个开始的0是有效的。

但图书馆无法理解它,因为它违反了国家代码。电话号码从哪里来,不知道是从哪里来的吗?

文档似乎对此很清楚:

public PhoneNumber parse(CharSequence numberToParse, String defaultRegion)

@param defaultRegion我们期望数字来自的区域。仅当*正在解析的数字未以国际格式写入时,才使用此选项。在这种情况下,*
号码的国家/地区代码将存储为提供的默认地区的国家/地区代码。如果号码*保证以“”开头,后跟国家/地区呼叫代码,则为RegionCode。可以提供ZZ*或null。

因此,如果html" target="_blank">添加33

System.out.printLn("Number -> " + phoneNumberUtil.parse("+336555233634", null).toString())

那么结果自然是:

数-

如果最终用户向我的应用程序提供的电话号码不是以开头,我该怎么办?我不能相信我是唯一一个在这种情况下。

谢谢你的帮助!

共有2个答案

容阳焱
2023-03-14

将原始电话号码存储在非操作列RAW_phone中,并将规范的E.164标准号码存储在you phone列中(“00”-

可以想象的是,表中有两个phone列,第二个值是另一个扩展名-203

如果国家代码转换失败或有其他可疑之处,最好不要填写strict字段。默认值是法国,还是用户居住在比利时?有人可能会说,用户注册的来源(位置)决定了默认的国家代码。

马权
2023-03-14

您只需要使用E164格式。这里我以挪威为例

我有一个测试用例,它测试并以一种格式给出电话号码。

public static String getE164FormattedMobileNumber(String mobile, String locale)
            throws PhoneNumberFormatException {
        try {
            PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
            PhoneNumber phoneProto = phoneUtil.parse(mobile, locale);
            if (phoneUtil.isValidNumber(phoneProto)
                    && phoneUtil.isPossibleNumberForType(phoneProto, PhoneNumberType.MOBILE)) {
                return phoneUtil.format(phoneProto, PhoneNumberFormat.E164);
            }
            throw new PhoneNumberFormatException(
                    "Mobile number is invalid with the provided locale");
        } catch (NumberParseException e) {
            throw new PhoneNumberFormatException("Error in parsing mobile number", e);
        }
    }

测试用例如下所示。

// this is the test mobile used
    private String expectedMobileNumber = "+4746205615";
private List<String> sucessMobileNumbers;

private List<String> failMobileNumbers;

public PhoneNumberE164FormatTest() {
    sucessMobileNumbers =
            Arrays.asList(
                    "46205615",
                    "004746205615",
                    "+4746205615",
                    "4746205615",
                    "46205615",
                    "+47 46205615",
                    "462 05 615");
    failMobileNumbers = Arrays.asList("abcdsds3434", "abcdsds343?#4", "21448410", "9946739087");
}

@Test
public void e164FormattedMobileNumbersSucessCase() throws PhoneNumberFormatException {

    for (String mobileNumber : sucessMobileNumbers) {
        Assert.assertEquals(
                expectedMobileNumber,
                (PhoneNumberUtils.getE164FormattedMobileNumber(mobileNumber, NO)));
    }
}

@Test(expected = PhoneNumberFormatException.class)
public void e164FormattedMobileNumbersFailCase() throws PhoneNumberFormatException {
    for (String mobileNumber : failMobileNumbers) {
        PhoneNumberUtils.getE164FormattedMobileNumber(mobileNumber, NO);
    }
}
 类似资料:
  • 我有来自任何国家的电话号码列表(字符串)。 例如:

  • 我有这样一个字符串:33123456789(法语电话号码)。我想在不知道国家的情况下提取国家代码(33)。例如,如果我有另一部来自另一个国家的手机,它应该可以工作。我使用谷歌图书馆https://code.google.com/p/libphonenumber/. 如果我知道国家,那很酷,我可以找到国家代码: 但是我找不到一种在不了解国家的情况下解析字符串的方法。

  • 在Github上libphonenumber提供的文档中,有一个演示,它将提供的任何数字转换为国际格式,例如转换为 我想在C#中使用相同的功能。 在libphone的文档中,需要解析号码并提供国家/地区。但是,演示在不提供地区/国家信息的情况下工作。有人能告诉我是怎么做的吗?

  • 我需要在UITextField中显示电话号码格式作为占位符。我怎么能那样做? 对于国家选择,我使用下面提到的库,它提供了针对用户选择的国家的国旗和国家代码。 https://github.com/NikKovIos/NKVPhonePicker 选择国家后,我需要显示所选国家的电话号码格式,提交该电话号码时,我必须验证电话号码。 我还发现,第三方(PhoneNumberKit)的灵感来源于谷歌的l

  • 我想要电话号码的国家代码列表。例如,美国(1),英国(44)...我知道libphonenumber是一个帮助手机解析、格式化和验证的好工具。然而,它似乎没有列出所有国家代码的功能。但是那些数据应该在libphonenumber的元数据中,对吗?有人有这方面的经验吗?

  • 我看到了一些与我要求的相似的问题,但似乎没有什么符合要求的。 我处于需要处理通话记录并使用电话号码确定国家的位置。拨打的号码可以是任何国家,例如: 44 7899455120-英国 34 965791845-西班牙 355 788415235-阿尔巴尼亚 显然,如果所有的呼叫代码都是两位数的话,这个世界将是美好的,但事实并非如此。目前,我有一个数据库,里面有国家及其相关代码,为了匹配,我需要有效地