电话号码规范化:任何预先存在的库?

Posted

技术标签:

【中文标题】电话号码规范化:任何预先存在的库?【英文标题】:Phone number normalization: Any pre-existing libraries? 【发布时间】:2010-09-20 12:21:48 【问题描述】:

我有一个使用电话号码作为唯一标识符的系统。出于这个原因,我想在所有电话号码使用标准化格式时对其进行格式化。因为我无法控制我的源数据,所以我需要自己解析这些数字并格式化它们,然后再将它们添加到我的数据库中。

我即将编写一个可以读取电话号码并输出标准化电话格式的解析器,但在此之前,我想知道是否有人知道我可以使用任何预先存在的库来格式化电话号码。

如果没有预先存在的库,在创建这个可能不明显的功能时我应该记住什么?

虽然我的系统目前仅处理美国号码,但我计划尝试包括对国际号码的支持以防万一,因为有可能需要它。

编辑我忘了说我使用的是 C#.NET 2.0。

【问题讨论】:

@Dan,如果您告诉我们您使用的哪种语言,我想您会得到更好的答案。 :-) 我在这个问题中添加了 C#2.0 标签。 @Joel,我不想发起编辑大战,但我确实用 C#2.0 标记了这个问题,原因是(我认为):***.com/questions/247621/… @Dan 你找到了一个标准化电话号码的库吗? @marc.d 不,我没有。我最终写了自己的,非常适合我的需要。 【参考方案1】:

您可以使用来自 Google 的 libphonenumber。这是一篇博文:

http://blog.appharbor.com/2012/02/03/net-phone-number-validation-with-google-libphonenumber

解析数字就像安装 NuGet package 然后执行此操作一样简单:

var util = PhoneNumberUtil.GetInstance();
var number = util.Parse("555-555-5555", "US");

然后您可以像这样格式化数字:

util.Format(number, PhoneNumberFormat.E164);

libphonenumber 支持 E.164 以外的多种格式。

【讨论】:

这个库很棒。很好的建议。【参考方案2】:

我目前参与了OpenMoko 项目,该项目正在开发一款完全开源的手机(包括硬件)。在规范电话号码方面遇到了很多麻烦。我不知道是否有人提出了一个好的解决方案。最大的问题似乎是美国电话号码,因为有时它们的前面带有 1,有时则没有。根据您在联系人列表中存储的内容,它可能会或可能不会正确显示来电显示信息。我建议去掉电话号码上的 1(尽管我希望大多数人一开始不会输入它)。您可能还需要在国际号码前面查找加号或国家/地区代码。

您可以查看 OpenMoko 网站、邮件列表和源代码管理,看看他们是否已经解决了这个错误。

【讨论】:

【参考方案3】:

perl 和 rails 示例


http://validates-as-phone.googlecode.com/svn/trunk/README

http://www.perlmonks.org/?node_id=159645

【讨论】:

【参考方案4】:

只需去掉所有非数字,可能使用正则表达式:[^\d]

唯一的例外可能是您想处理分机号、区分没有区号但有 3 位分机号的号码,或者如果您需要处理国际号码。

【讨论】:

【参考方案5】:

您需要的是所有国家/地区代码的列表,并开始将您的字符串前几个字符与国家/地区代码列表进行匹配,以确保它是正确的,然后对于其余的数字,确保它是所有数字和适当的长度,通常会有所不同5-10位数。

要实现对国家/地区代码的检查,请安装NGeoNames nuget,它使用网站www.geonames.org 来获取所有国家/地区代码的列表以用于匹配它们。

【讨论】:

以上是关于电话号码规范化:任何预先存在的库?的主要内容,如果未能解决你的问题,请参考以下文章

ANDROID:接听电话后播放音频

如何在 Stripe Express 入职时预填手机号码、业务类型?

PHP 规范化电话号码

如何仅在使用联系人选择器存在电话号码时显示

在 Symfony 中使用预先存在的库

我可以在 Stripe Express Onboarding 中预填手机号码字段吗?