【问题标题】:phone number should be a string or some numeric type that have capacity to save phone number?电话号码应该是一个字符串或一些能够保存电话号码的数字类型?
【发布时间】:2017-07-04 11:45:53
【问题描述】:

我们要存储 10 位手机号码,即 9999999999。它应该是数字还是字符串数据类型?我们不想对此进行任何计算或操作操作

内存和性能哪个更好?

【问题讨论】:

  • 内存 + 性能 = int。但是这点性能提升应该是您最不必担心的
  • 如果您的用户键入数字并且您不关心它的正确性,那么不要将自己限制为仅存储数字而允许其他字符。字符串
  • 电话号码可以以 0 开头,因此整数不适合。如果您使用的是国际电话号码,则使用 + 号
  • 你不会用电话号码做数学运算。此外,如果您在处理电话号码时担心内存和性能,那么您的注意力就错了。
  • 有人提出结束这个问题,因为它是基于意见的。我不同意那个人,考虑到 ITU-T 有一个标准。

标签: c# sql phone-number telephony


【解决方案1】:

ITU-T recommendation E.164 表示您需要 3 位数的国家代码和最多 15 位数的国家拨号计划中的目录号码。

而且,许多人添加了一些标点符号。例如:

+1.212.555.1212 是北美号码。也可以渲染 (212) 555-1212 在以北美为中心的应用程序中。

32 个字符的文本应该可以在全球范围内发挥作用。

请勿使用数字,否则您会感到抱歉。我是:两件事。

  • 因为我们假设所有电话号码都是NANP-compliant 十位数号码,因此失去了一些公司的欧洲业务。
  • 电子表格导出以科学计数法呈现数字2.12555E+09 这几乎和 SIRI 告诉我的一样愚蠢您收到了 20 亿、1.25 亿的电话...

电话簿号码不是数字数据类型。看看这个:Falsehoods Programmers Believe About Telephone Numbers

【讨论】:

  • 有带字母的电话号码吗?电话号码格式由位置决定,因此如果您要收集电话号码而不是位置,这是一个很好的答案。
  • E.164 不考虑字母,只考虑数字。和标点符号。但是,如果您使用文本字符串来表示目录号码,则没有什么可以阻止您使用字母。但是像CEntral 2- 1212 这样的目录号码的日子已经一去不复返了。
【解决方案2】:

它必须是string,因为电话号码将超过int 甚至long 的限制。因此,对于处理这些场景,string 始终是首选。

【讨论】:

    【解决方案3】:

    有几点需要牢记:

    通常,您不打算对其进行计算的数字应存储为字符串形式。 如果您需要数字能够以零开头(就像您所做的那样,因为某些电话号码会这样做),这是必不可少的。

    因此,即使(或何时)您可以将电话号码存储为一个大整数(您可以使用 64 位整数),您也不应该这样做。一旦数字以零开头,您就会丢失数据。

    在存储电话号码时,请记住国家代码是一种特殊类型的信息。如果您在存储时将其与其他号码分开,您会做得最好。通过这种方式,您可以轻松地按国家/地区查询电话号码,并且您不必多次解析号码(在存储之前,而不是每次获取它时)。 此外,如果您将电话号码与国家/地区代码一起存储,则需要验证该内容以确保您始终存储国家/地区代码,因为来自两个不同国家/地区的两个号码可能相同,如果一个有国家代码,另一个没有。

    还请记住,标点符号是一种表示方法,因此与您存储数据的方式无关。 您始终可以选择以您想要的方式呈现数据,而您想要的方式在所有情况下都取决于许多因素。例如,您要呈现什么样的数据,向谁呈现数据,在某些情况下甚至是何时您正在呈现数据。 如果是电话号码,您应该将号码存储为字符串,不带任何标点符号。

    我建议您查看用于解析、格式化和验证国际电话号码的 Google 库 (https://github.com/googlei18n/libphonenumber)。你可以给这个图书馆提供你的电话号码和国家代码,它会给你很多有用的信息,比如这个号码是否可行和有效,它属于哪个地区,它是什么类型的号码等.

    专业提示 I: 为您的用户提供一种选择号码所属国家/地区的方法,而不是让他们输入国家/地区代码。对您更好,对您的用户也更好。

    专业提示 II:很少有“以北美为中心的应用”或“以此处为中心的应用”之类的东西,尤其是当您的应用在网络上可用时。确实会发生,但很少见,因此明智的做法是为全世界准备您的应用程序,而不是一小部分。

    【讨论】:

    • "... 一个您不打算对其进行计算的数字,应该以字符串形式存储。" ~Amen.
    【解决方案4】:

    您可以使用“ulong”来存储长整数值。并读取特定值或电话号码,您可以使用“Convert.ToUInt64(Console.ReadLine());”

    【讨论】:

      猜你喜欢
      • 2021-05-15
      • 2019-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 2017-10-17
      • 2014-01-01
      • 1970-01-01
      相关资源
      最近更新 更多