我有一个使用电话号码作为唯一标识符的系统。出于这个原因,我想使用标准化格式格式化所有电话号码。因为我无法控制我的源数据,所以我需要自己解析这些数字并将它们格式化,然后再将它们添加到我的数据库中。
我即将编写一个可以读取电话号码并输出标准化电话格式的解析器,但在此之前,我想知道是否有人知道我可以用来格式化电话号码的任何预先存在的库。
如果没有预先存在的库,那么在创建可能不明显的此功能时,我应该记住哪些事项?
虽然我的系统目前只处理美国号码,但我打算尝试包括对国际号码的支持,以防万一有可能需要它。
编辑我忘了提到我正在使用C#.NET 2.0。
答案 0 :(得分:18)
您可以使用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以外的其他几种格式。
答案 1 :(得分:5)
我目前正参与OpenMoko项目,该项目正在开发一个完全开源的手机(包括硬件)。规范电话号码存在很多麻烦。我不知道是否有人提出了一个很好的解决方案。最大的问题似乎是美国的电话号码,因为有时他们会在前面输入1,有时则没有。根据您在联系人列表中存储的内容,它可能会也可能不会正确显示来电显示信息。我建议剥掉电话号码上的1(虽然我希望大多数人不会首先输入它)。您可能还需要在国际号码前面查找加号或国家/地区代码。
您可以查看OpenMoko网站,邮件列表和源代码管理,看看他们是否已经解决了这个问题。
答案 2 :(得分:2)
答案 3 :(得分:1)
只需删除任何非数字,可能使用RegEx:[^\d]
唯一的例外是,如果您想要处理扩展,区分没有区号但有3位数字扩展名的号码,或者您需要处理国际号码。
答案 4 :(得分:0)
你需要的是所有国家代码的列表,并开始匹配你的字符串前几个字符与国家代码列表,以确保它是正确的,然后对于其余的数字,确保它的所有数字和适当的长度通常变化从5-10位数。
要对国家/地区代码进行检查,请安装使用网站NGeoNames nuget的www.geonames.org以获取用于与之匹配的所有国家/地区代码的列表。