【问题标题】:Dealing with phone numbers formats处理电话号码格式
【发布时间】:2011-10-10 09:41:32
【问题描述】:

我认为我在这里面临一个悖论。

我正在尝试做的是当我接听/拨打电话时,我有号码,所以我需要知道它是否是国际号码,是否是本地号码等。

问题是:

  1. 为了让我知道一个数字是否是国际的,我需要解析它并检查它的长度,但是,长度因国家/地区而异,那么,我应该为每个国家/地区执行解析和识别的方法吗? (我认为不起作用);
  2. 为了让我知道它是否是本地号码,我需要区号,所以我必须做同样的事情,解析号码并检查长度,根据区号长度获取第一个数字;

很难找到解决方案。图书馆libphonenumber 提供了很多有用的课程,但我认为可以帮助我的课程却让我陷入了另一个悖论。

phoneUtil.parse(number, countryAcronym) 方法返回带有国家代码的号码,但它的作用是,如果我传递带有首字母缩写词“US”的号码,它现在返回带有国家代码“1”的号码如果我将首字母缩写词更改为“BR”,它会更改数字并返回“55”,即巴西的国家代码。所以,无论如何,我需要基于我得到的数字的国家首字母缩写词。

前:

numberReturned = phoneUtil.parse(phoneNumber, "US");
phoneUtil.format(numberReturned, PhoneNumberFormat.INTERNATIONAL);

上面的代码返回带有美国国家代码的数字,但现在如果我将“US”更改为任何其他国家/地区的首字母缩写词,它将返回相同的数字,但带有该国家/地区的国家代码。

我知道这个库不应该猜测数字来自哪个国家(那会很棒!),但这正是我所需要的。

这真的让我发疯了。我需要来自 SO 的聪明法师的好建议。

如果您能帮助我做出正确的决定,我将不胜感激。

谢谢。


PS:如果你已经使用 libphonenumber 并且有更多经验,请指导我使用哪个类,如果有能够解决这个问题的类。 =)

【问题讨论】:

    标签: java android telephony phone-number


    【解决方案1】:

    1) phoneUtil.parse 的第二个参数必须与您当前所在的国家/地区匹配 - 如果收到的电话号码不包含国际前缀,则使用它。这就是为什么在更改参数时会得到不同的结果:您传递给它的电话号码不包含这样的前缀,所以它只是使用您告诉它的内容。

    任何用于确定电话号码是否为国际电话号码的解析解决方案都需要注意这一点:根据来源,即使是国内号码也可以用国际拨号前缀表示(通常抽象为 +,因为它国家之间有所不同,但这不能保证)。

    2) 对于区号解析,没有通用的标准;有些国家不使用它们,即使在一个国家内,区号也可能有不同的长度(例如德国)。我不知道有这方面的国际图书馆 - 快速搜索没有找到任何东西(尽管这并不意味着不存在)。您可能需要在这里自己动手;如果你只需要支持一个国家,这应该不会太难。

    【讨论】:

    • 是的。但问题是我必须支持几乎所有国家。这将很难,需要大量的研究和思考才能得出一个简单而明智的结论。一个好的方法是获取国家/地区的数字,是通过解析数字来做到这一点的唯一方法吗?无论如何,谢谢。
    • 差不多,是的。您需要检查电话号码字符串是否以 + 开头,或者任何适合您所在国家/地区拨打国际电话的前缀 - 如果不存在,那么它是国家的。手机知道要发送哪些数字来代替那个 + 号,但我不知道如何从您的代码中检索它。
    猜你喜欢
    • 2014-04-01
    • 2012-08-11
    • 2012-07-16
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    相关资源
    最近更新 更多