20

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

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

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

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

编辑我忘了提到我正在使用 C#.NET 2.0。

4

5 回答 5

25

你可以libphonenumber从谷歌使用。这是一篇博文:

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

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

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

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

util.Format(number, PhoneNumberFormat.E164);

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

于 2012-02-04T02:08:24.270 回答
5

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

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

于 2008-11-03T15:55:54.023 回答
2

perl 和 rails 示例


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

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

于 2008-11-03T16:45:00.633 回答
1

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

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

于 2008-11-03T15:40:16.083 回答
0

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

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

于 2016-08-28T22:23:35.340 回答