存入数据库前统一phone个数

Unify phone numbers before store in database

我想从用户的phone地址簿中导入所有联系人号码并将它们存储在数据库中但是因为我想稍后对它们进行一些处理,所以所有phone 数字应该有一个统一的格式。

我在互联网上做了一些研究,发现 phone-numbers 有三种主要格式:(source: googlei18n/libphonenumber)

然后我导出并提取我的 phone 联系电话,但我知道有很多来自不同国家和运营商的不同格式的电话号码。

这里有一些例子:

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

基于 google 的库,如果你想将任何 phone 数字转换为不同的格式,我想你必须知道它们属于哪个国家和在哪个国家我的情况是,每个联系人都属于不同的国家。

现在,我的问题是准备并将它们全部转换为一种特定格式的步骤是什么?

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

这些答案使用 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 的国家/地区代码仅在输入号码无法解析为国际号码时用作后备。