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

Dan*_*ski 15 database language-agnostic user-interface

程序员的角度来看,以某种规范格式存储电话号码有几个优点,但如果突然输入的数字看起来很不一样,它可能会使用户感到困惑.

怎么走?

Ego*_*hin 21

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

我就是这样做的.

  • +1:信用卡号码也一样.我应该被允许输入'1234 5678 9012 3456'或'1234-5678-9012-3456',你应该验证一致的标点符号(和校验和......)并存储它你想要的地狱(没有标点符号) ).但是强迫我输入没有标点符号'123456798012345'是残忍的 - 让我的行为就像一台电脑,而不是让电脑表现得像个人. (11认同)
  • (*如果用户在基数10输入,则不选择使用助记符号码,并且不在1935年生活) (3认同)

Ada*_*ent 7

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

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

正如@Gumbo所暗示的那样,我会将电话号码存储为E.164,上面的库会为您解析.它可以从几种不同的编程语言中使用.

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

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


Rob*_*lan 6

你的用户群是什么?

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

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

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


小智 6

职责分离 - 内容和渲染

将数字存储为规范格式和显示格式掩码.

收益:

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

烦恼:

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


Chr*_*isF 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(取决于实际数字).

存在以输入形式存储并存储在单个表单中的参数:

如果您将数字存储为数字序列,则可以通过考虑用户首选项或其区域设置并根据"规则"(无论它们可能是什么)分割数字,以您想要的任何方式输出数字.

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


mP.*_*mP. 5

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