以某种规范格式或“输入”存储电话号码更好吗?

时间:2009-10-10 13:20:53

标签: database language-agnostic user-interface

以某种规范格式存储电话号码从程序员的角度来看有几个优点,但如果突然输入的数字看起来很可能会混淆用户很多不同。

要走的路是什么?

12 个答案:

答案 0 :(得分:21)

根据您的喜好存储它,但在将其显示给用户之前将其转换为人类可读的格式。请不要强迫您的用户以您选择的格式输入电话号码,让他们只需输入即可。

我就是这样做的。

答案 1 :(得分:7)

希望这是对旧问题更实际和更实用的答案。

看看https://github.com/googlei18n/libphonenumber

正如@Gumbo所提到的,我会将电话号码存储为 E.164 ,上面的图书馆为您解析。它可以从几种不同的编程语言中使用。

对于数据库存储,您实际上可以将E.164用作Base64(因为它具有讽刺意味的是有效的base64),并将Base64解码为字节。我相信像这样的字符串的字节数符合标准long。就个人而言,我只是将E.164作为字符串存储在数据库中。

当然,您可能还应该存储用户在解析之前输入的内容,但我强烈建议您输入一些规范的数字,例如E.164,以便将来与其他系统集成。

答案 2 :(得分:6)

您的用户群是什么?

如果它们的地理位置有限(例如,仅限美国),并且您要严格验证数字,那么请为它们规范格式化数字 - 即删除它们使用的任何格式(如数字......)并加入破折号(如果它们不符合您的格式,请不要通过验证...这只是意思)。我将清理后的版本存储在数据库中,而不是剥离的数字;它可以在生成自定义报告等时让您的生活更轻松。

如果您可能拥有来自世界各地的用户/号码,最好保存他们使用的格式。另外,请不要忘记有时美国居民正在旅行并使用外国号码的情况:不要无意中阻止他们。

无论哪种方式:确保不要将列定义为数字,或将其设置得太小。带格式的国际号码很容易超过16个字符。

答案 3 :(得分:6)

职责分离 - 内容和渲染

以规范格式和显示格式掩码存储号码。

收益:

  • 一致性,质量和易于分析的规范格式
  • 从最终用户角度保留的格式
  • 格式可重复使用,以最终用户首选方式显示其他电话号码
  • 其他格式的面具可用于向需要查看电话号码的其他用户显示规范号码

烦恼:

  • 将电话号码解析为规范格式
  • 解析显示格式的面具(与上面的子弹结合不太痛苦)
  • 将显示格式存储为最终用户首选项

答案 4 :(得分:5)

英国是一个特例,因为我们有可变长度的STD(区域)代码和可变长度的用户号码本身。 STD代码越长,数字越短。德国和其他一些国家也有类似的制度。

在0主干(长途)前缀后,数字大多是10位数,但是数十个区域也有9位数字。

  • 020 2345 5678(伦敦)也加的夫,南安普敦,朴次茅斯,考文垂和北爱尔兰
  • 0115 234 4567(诺丁汉)谢菲尔德,布里斯托尔,莱斯特,雷丁和利兹
  • 0141 345 5678(格拉斯哥)还有伯明翰,爱丁堡,泰恩赛德,曼彻斯特和利物浦
  • 01332 234 456(德比)大多数其他区域(约580个区域)也使用此格式
  • 01750 45678(塞尔柯克)和大约40个区域有一些数字较短的数字
  • 017687 45678(Keswick)还有Langholm,Hornby,Hawkshead,Grange-over-Sands,Sedbergh,Wigton,Raughton Head,Brampton,Appleby,Pooley Bridge和Gosforth。
  • 016977 2345(布兰普顿)唯一使用“5 + 4”格式的地方。
  • 07812 123 456(手机号码)

请注意0800号码的长度可以不同,例如0800 567 1234或0800 234 456。 旧的0500号码也是一个较短的数字,例如0500 456 456。

此外,有些人喜欢将他们的号码分组234 234,而其他人则使用23 23 23(取决于实际数字)。

存在以输入形式存储并以单一形式存储的参数:

如果您将数字存储为数字序列,那么您可以通过考虑用户首选项或其区域设置并根据“规则”(根据“规则”分割数字)以任何您想要的方式输出数字。定)。

如果您按输入存储,那么您将始终按照用户的预期显示它,但在使用之前您需要删除非数字值,如果它通常很昂贵。

答案 5 :(得分:5)

我会保留原来输入的混乱,但也会在数据库中插入一个清理过的表单。这使得数字减少了标点符号和空格。使用清理后的表单可以轻松查找,而无需担心不同的输入样式。

答案 6 :(得分:4)

规范化电话号码的主要困难是确定正确的规范格式。不同的国家/地区有不同的数字分组方式 - 在一个国家/地区内,不同的数字可以进行不同的分组。

它使用(十年或更久以前)在英国,你有01-234-2345,021-234-1234,0334-234234,甚至092324-213;现在英国的情况有所不同 - 通常是更多的数字,我不再确定分组(缺席使得一个人的知识减少了)。

处理国家/地区前缀并指示内部国家/地区拨号前缀很有趣:+44(0)1394-726629是英国号码,国家/地区代码44;从英国境外拨打,丢0;在英国境内拨号时,请不要包含国际前缀,但要包括0.请注意,如果您遵循E.123标准,其中带有(0)的表格实际上无效。

这类似于规范化邮件地址的问题 - 不是那么复杂,但仍然很糟糕。

另外,正如我对HeavyWave回答的评论所指出的,强迫人们输入电话号码作为没有标点符号的数字字符串是令人讨厌的。以这种方式存储它是好的;只是以人类可读的格式呈现数据。那里有太多懒惰的网页编程。

答案 7 :(得分:1)

我的直觉是根据实体的本地标准进行规范化,然后在规范表示模拟可用性中进行渲染。

答案 8 :(得分:1)

让用户输入他们熟悉的任何格式,然后验证它并以一致的格式将其存储在数据库中 - 最好包含国家/地区代码。

显示数字时,以正确的间距显示该数字范围的正确格式,对于国家格式数字,如果需要,在区号附近添加括号。

如果显示为国际号码,请特别注意不要包含因国家/地区而异的任何国际访问代码,例如:显示法国号码为011 33 55 66 77 88(从美国和加拿大拨打)对英国读者没用,因为他们将拨打00 33 55 66 77 88;始终使用+33 55 66 77 88格式。

同样使用国际格式,永远不要包含(0)中继前缀。国际格式应仅包括从国外拨打的数字。

答案 9 :(得分:0)

验证输入但允许多种格式。将其存储为用户输入的格式,然后根据需要重新格式化输出。

假设用户在注册公共电话簿应用程序时键入了他的号码。因此,我会在“编辑我的个人资料”页面的文本字段中显示“用户输入”。但我会在公共用户电话簿列表中将其重新格式化为标准格式。

答案 10 :(得分:0)

有用的资源:

英国地区代码列表:http://www.telephonenumbers.co.uk/Telephone-Area-Codes-UK/i=2(2011年7月)。

英国的号码长度/号码格式列表(涵盖01和02号码):http://www.aa-asterisk.org.uk/index.php/01_numbers

“混合”区域的分配:http://www.aa-asterisk.org.uk/index.php/Mixed_areas

“ELNS”区域的分配:http://www.aa-asterisk.org.uk/index.php/ELNS_areas

包含格式信息的英国前缀列表:http://www.aa-asterisk.org.uk/index.php/Sabc.txt

格式化英国数字肯定比(01234)567890,(0141)234 5678和(020)3456 7890更复杂。

答案 11 :(得分:-1)

我通常喜欢存储剥离的数字,然后格式化显示。由于我通常不会在全球范围内构建应用程序,因此我通常不必担心格式。但是,对于全世界的应用程序,我可能会构建一个格式化模块,根据电话号码的区域设置进行格式化。