我认为我在这里面临着一个悖论。
我想做的是,当我接听/调用电话时,我有号码,所以我需要知道它是否是国际号码,是否是本地号码等。
问题是:
- 为了知道一个号码是否是国际号码,我需要解析它并检查它的长度,但是,不同国家的长度不同,所以,我应该做一个解析和识别每个国家的方法吗? (我认为不起作用);
- 为了知道它是否是本地号码,我需要区号,所以我必须做同样的事情,解析号码并检查长度,根据区号长度获取第一个号码;
找到这个问题的解决方案有点困难。图书馆libphonenumber提供了很多有用的类(class),但我认为可以帮助我的类(class)却让我陷入了另一个悖论。
方法phoneUtil.parse(number,countryAcronym)返回带有国家/地区代码的号码,但它的作用是,如果我传递带有首字母缩略词“US”的号码,它会返回带有国家/地区代码“1”的号码,现在如果我将首字母缩略词更改为“BR”,它会更改数字并返回“55”,这是巴西的国家/地区代码。所以,无论如何,我需要根据我得到的数字提供国家/地区缩写。
例如:
numberReturned = phoneUtil.parse(phoneNumber, "US");
phoneUtil.format(numberReturned, PhoneNumberFormat.INTERNATIONAL);
上面的代码返回带有美国国家/地区代码的号码,但现在如果我将“US”更改为任何其他国家/地区的缩写,它将返回相同的号码,但带有该国家/地区的国家/地区代码。
我知道这个库不应该猜测号码来自哪个国家(那太棒了!!),但这就是我需要的。
这真的让我的心发疯了。我需要 SO 的明智法师提供好的建议。
如果您能帮助我做出明智的决定,我将非常感激。
谢谢。
<小时/>PS:如果您已经使用 libphonenumber 并且对此有更多经验,请指导我使用哪个类(如果有一个类能够解决此问题)。 =)
最佳答案
1) phoneUtil.parse
的第二个参数必须与您当前所在的国家/地区匹配 - 如果收到的电话号码不包含国际前缀,则使用该参数。这就是为什么当您更改参数时会得到不同的结果:您传递给它的电话号码不包含这样的前缀,因此它只使用您告诉它的内容。
任何设置为确定电话号码是否为国际电话号码的解析解决方案都需要注意这一点:根据来源,即使是国内号码也可能用国际拨号前缀表示(通常抽象为 +,因为它国家/地区之间有所不同,但这不能保证)。
2)对于区号解析,没有通用标准;有些国家/地区不使用它们,即使在一个国家/地区内,区号也可能具有不同的长度(例如德国)。我不知道有这样的国际图书馆 - 并且快速搜索没有找到任何东西(尽管这并不意味着不存在)。您可能需要在这里自己动手;如果您只需要支持一个国家,这应该不会太难。
关于java - 处理电话号码格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7707564/