什么是代表电话号码的正确方法?

use*_*344 43 java integer phone-number

我在我的一个应用程序中代表手机号码时遇到问题.

我想知道是否有一个Integer类允许你存储从0417254482开始的这样一个数字.也许使用字符串更合适?目前,当我试图用一个代表一个带有整数的电话号码时,双打长,我似乎存储随机数而不是我打算存储的数字.

Jon*_*eet 117

使用String.除了其他任何东西,如果你使用整数,你将无法存储前导零.你绝对不应该使用int(太小)floatdouble(太多的数据丢失风险 - 见下文); long或者BigInteger可能是适当的(除了领先的零问题),但坦率地说,我会去String.这样,您还可以存储用户输入的任何破折号或空格,以便更容易记住数字,如果您愿意.

在上面提到的"数据丢失"的条款floatdouble- float绝对没有足够的精度; double 可以工作,如果你高兴,你永远不会需要超过16位(比你得到一对夫妇较少long),但你必须非常,非常小心,任何地方,你从转换值回doublestring,你得到了确切的值.许多格式转换会为您提供一个近似值,可能精确到10位有效数字 - 但您需要一个精确的整数.基本上,使用浮点电话号码是一个根本不好的主意.如果必须使用固定宽度的数字类型,请使用a long,但理想情况下,完全避免使用它.

  • @WesleyMurch:*所有*英国电话号码以0开头.例如,Reading的区号为0118. (5认同)
  • @WayneM:这对我来说听起来是个坏主意,如果你需要处理其他国家的话,几乎肯定会咬你...... (2认同)

man*_*war 36

想一想:电话号码真的是一个号码吗?使用电话号码添加(或进行其他算术运算)是否有意义?电话号码是代码,它们通常用数字表示,但这只是一个惯例,也许,在另一个国家也使用字母(我刚刚意识到,国际电话号码怎么样?他们有一个+开头.你.必须考虑你想要表达的事物的本质,然后找到最合适的表示.

  • 我没有对ID进行任何算术运算,但我将它们存储了很长时间. (5认同)
  • @rds:因为对于每个新记录,ID通常*递增*,这是一个算术运算.你可能不会自己做,但它确实发生了. (5认同)

Tpt*_*Tpt 7

如果您想进行验证和规范化,您可能需要依赖一个可以正确完成此操作的库。https://github.com/googlei18n/libphonenumber是最常见的选项之一。


sna*_*ile 5

使用 String 类型的私有字段创建您自己的 PhoneNumber 类来表示它。

public class PhoneNumber {
   private String number;
   public PhoneNumber(String number) {
      //check validity of number
      this.number = number;
   }
   //getter, comparator, etc...
}
Run Code Online (Sandbox Code Playgroud)

如果所有电话号码的长度相同,您也可以使用 long 或 BigInteger 表示数字,但要小心前导零。

电话号码并不是真正的整数(或字符串)。它是其他应该有自己的类的东西。

编辑:还有一件事:我不会为这个类实现一个setter,因为电话号码对象最好是不可变的


Joh*_*ter 5

尽管电话号码是命名号码,但它们通常不是数字(例如前导零、国家/地区前缀 +XX、...)。

因此,在程序中正确表示电话号码有两种可能性:

  1. 使用String以保持整数那样的方式输入。
  2. 使用为电话号码功能提供额外支持的自定义数据类型

    public class PhoneNumber implements Comparable<PhoneNumber>{
    
        private String countryCode;
    
        private String areaCode;
    
        private String subscriberNumber;
    
        // Constructor(s)
    
        // Getter
    
        // HashCode + Equals
    
        // compareTo
    
        @Override
        public String toString(){
            return countrycode + " " + areaCode + " " + subscriberNumber;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

看看国际上使用的所有不同的约定真的很有趣