我从一个看起来很棒的图书馆听到了很多好消息,但我发现自己处于微妙的境地。
这是我工作过的第一个将电话号码存储在数据库中的项目。
我读过一些关于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())
那么结果自然是:
数-
如果最终用户向我的应用程序提供的电话号码不是以开头,我该怎么办?我不能相信我是唯一一个在这种情况下。
谢谢你的帮助!
将原始电话号码存储在非操作列RAW_phone中,并将规范的E.164标准号码存储在you phone列中(“00”-
可以想象的是,表中有两个phone列,第二个值是另一个扩展名
-203
。
如果国家代码转换失败或有其他可疑之处,最好不要填写strict字段。默认值是法国,还是用户居住在比利时?有人可能会说,用户注册的来源(位置)决定了默认的国家代码。
您只需要使用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-阿尔巴尼亚 显然,如果所有的呼叫代码都是两位数的话,这个世界将是美好的,但事实并非如此。目前,我有一个数据库,里面有国家及其相关代码,为了匹配,我需要有效地