在存储到数据库之前统一电话号码

时间:2015-12-15 09:58:49

标签: database validation phone-number libphonenumber

我想从用户的电话地址簿导入所有联系人号码并将其存储在数据库中,但由于我想稍后对其进行处理,所有电话号码都应该采用统一格式。

我在互联网上做了一些研究,我发现电话号码有三种主要格式:(source: googlei18n/libphonenumber

  • INTERNATIONAL
  • NATIONAL
  • E164

然后我导出并提取我的手机联系号码,但我知道来自不同国家和运营商的大量不同的格式号码。

以下是一些例子:

 0123456789
 0 12-345 6789
 +6012345678
 +27 60 123 4567‬
 09131234567
 +98 (310) 1234567
 00982101234567

基于Google的图书馆,如果您想将任何电话号码转换为其他格式,我想,您必须知道他们属于哪个国家/地区,在我的情况下,每个联系人都属于不同的国家/地区。

现在,我的问题是准备并将所有这些步骤转换为特定格式的步骤是什么?

我需要知道这个操作的整个概念但是如果你想编写代码,任何编程语言都可以。

1 个答案:

答案 0 :(得分:1)

这些答案使用了python版本的libphonenumber,但AFAIK规则在其他端口中是相同的。

将任意国际号码转换为统一格式真的简单......

>>> import phonenumbers
>>> x = phonenumbers.parse('+1-904-566-6820')
>>> phonenumbers.is_valid_number(x)
True
>>> phonenumbers.format_number(x, phonenumbers.PhoneNumberFormat.INTERNATIONAL)
'+1 904-566-6820'

您不需要知道国家/地区的国际格式编号(一开始就有'+')。

>>> phonenumbers.format_number(phonenumbers.parse('+1-904-566-6820'), phonenumbers.PhoneNumberFormat.INTERNATIONAL)
'+1 904-566-6820'
>>> phonenumbers.format_number(phonenumbers.parse('+1 (904) 566-6820'), phonenumbers.PhoneNumberFormat.INTERNATIONAL)
'+1 904-566-6820'
>>> phonenumbers.format_number(phonenumbers.parse('+33 6 10 45 04 89'), phonenumbers.PhoneNumberFormat.INTERNATIONAL)
'+33 6 10 45 04 89'

您需要知道某个国家/地区的唯一时间是源数不是有效的国际格式...

>>> phonenumbers.format_number(phonenumbers.parse('(904) 566-6820'), phonenumbers.PhoneNumberFormat.INTERNATIONAL)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home15/jgalloway12/code/wdPhone/phonenumbers/phonenumberutil.py", line 2450, in parse
    "Missing or invalid default region.")
phonenumbers.phonenumberutil.NumberParseException: (0) Missing or invalid default region.
>>> phonenumbers.format_number(phonenumbers.parse('(904) 566-6820', 'US'), phonenumbers.PhoneNumberFormat.INTERNATIONAL)
'+1 904-566-6820'

您传递给parse的国家/地区代码仅在输入数字无法解析为国际时才会作为后备。