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

Java 什么';代表电话号码的正确方法是什么?,java,integer,phone-number,Java,Integer,Phone Number,我在一个应用程序中表示手机号码时遇到问题 我想知道是否有一个Integer类允许您存储这样一个从0417254482开始的数字。也许使用字符串更合适? 目前,当我试图用int、double long来表示电话号码时,我似乎存储的是随机数,而不是我想存储的数字。使用字符串。除此之外,如果使用整数,您将无法存储前导零。您绝对不应该使用int(太小)float或double(数据丢失的风险太大-见下文)long或biginger可能是合适的(除了前导零问题),但坦率地说,我会选择String。这样,您

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

我想知道是否有一个Integer类允许您存储这样一个从0417254482开始的数字。也许使用字符串更合适?
目前,当我试图用int、double long来表示电话号码时,我似乎存储的是随机数,而不是我想存储的数字。

使用
字符串
。除此之外,如果使用整数,您将无法存储前导零。您绝对不应该使用
int
(太小)
float
double
(数据丢失的风险太大-见下文)
long
biginger
可能是合适的(除了前导零问题),但坦率地说,我会选择
String
。这样,您还可以存储用户输入的任何破折号或空格,以便更容易记住数字(如果需要)


就上面提到的
float
double
-
float
的“数据丢失”而言,肯定没有足够的精度<代码>双精度可以工作,如果您很高兴您永远不需要超过16位数字(比
long
少几个),但是您需要非常非常小心,无论您在哪里将值从
双精度
转换回
字符串
,都可以得到准确的值。许多格式转换将为您提供一个近似值,该近似值可能精确到(比如)10位有效数字,但您需要一个精确的整数。基本上,对电话号码使用浮点从根本上说是个坏主意。如果必须使用固定宽度的数字类型,请使用
长的
,但理想情况下,应完全避免使用它。

每个数字的左右两侧都有无穷多的零

要表示它,应该使用字符串格式化

class PhoneNumber implements Comparable<PhoneNumber> {

    private Long number;

    public PhoneNumber(Long number) {
        this.number = number;
    }

    public Long getNumber() {
        return this.number;
    }

    public boolean equals(Object object) {

        if (getNumber() == null && object == null) {
            return true; //or false its depend 
        }

        return getNumber().equals(object);
    }

    public int compareTo(PhoneNumber that) {

            if(that == null) {
             return -1;
            }

        Long thisNumber = getNumber();
            Long thatNumber = that.getNumber();

        if (thisNumber == null && thatNumber == null) {
            return 0; //or -1
        }

        if (thisNumber == null && thatNumber != null) {
            return -1;
        }

        return thisNumber.compareTo(thatNumber);

    }

    @Override
    public String toString() {
        return String.format("%010d", getNumber());
    }
}

创建您自己的PhoneNumber类,其中包含一个字符串类型的私有字段来表示它

public class PhoneNumber {
   private String number;
   public PhoneNumber(String number) {
      //check validity of number
      this.number = number;
   }
   //getter, comparator, etc...
}
如果所有电话号码的长度相同,也可以用long或biginger表示数字,但要注意前导零

电话号码实际上不是整数(或字符串)。它是另外一种东西,应该有自己的类别

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

您应该使用string来支持带前导零的数字。您提供的代码是:

Order order1 = new PickUpOrder(orderTime, 0473519954); 
//The pickup order requires an orderTime (String) and a contact number(Int). Heres    
//the constructor for PickUpOrder. 

public PickUpOrder(Date orderTime, String number) 
{ 
    discount = .2; 
    phoneNumber = number; 
    super.setOrderTime(orderTime); 
    //Test print 
    System.out.println(phoneNumber) 
    //reads int as 74049273 instead of 0473519954 
}

在构造函数中,数字是字符串,但当您调用构造函数时,您使用int作为电话号码。我认为java中一定有编译错误。这与您编译的代码相同吗?

想想看:电话号码真的是一个号码吗?把电话号码加起来(或做另一个算术运算)有意义吗?电话号码是代码,通常用数字来表示,但这只是一种惯例,可能在另一个国家也使用字母(我刚刚意识到,国际电话号码呢?它们一开始就有一个
+
)。
您必须考虑要表示的内容的性质,然后找到最合适的表示形式。

虽然电话号码是命名号码,但通常不是号码(例如,前导零、国家前缀+XX等)

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

  • 使用
    String
    保留输入的整数
  • 使用对电话号码功能提供额外支持的自定义数据类型

    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;
        }
    }
    
    公共类PhoneNumber实现可比较{
    私有字符串国家代码;
    专用字符串区域码;
    私有字符串subscriberNumber;
    //建造商
    //吸气剂
    //HashCode+等于
    //比较
    @凌驾
    公共字符串toString(){
    返回国家代码+“”+地区代码+“”+下标编号;
    }
    }
    

  • 查看所有不同的

    非常有趣,您应该使用字符串或更专业的数据结构

    主要原因是,你可以对电话号码进行的运算是字典式的,而不是算术运算。 e、 g.你可以说法国的电话号码以
    +33
    开头,但你不能假设它们在数字范围内

    在我看来,这些其他论点是无效的

      一个电话号码可以包括“代码> */代码>或<代码> <代码>。这些符号可以在电话线路上传输,但它们不是电话号码本身的一部分,我认为它超出了范围。
    • 电话号码可以以前导零开头。本地电话号码可以,但它们首先是有限的表示形式。国际电话号码以国家代码开头,并且没有前导零。因此,任何国际电话号码都没有前导零
    • 电话号码以++开头。一个数字可以完美地表示这一点,只要是正数即可。同样,以
      ++
      开头只是E164数字的一种表示形式,因此可以将其与本地数字区分开来。如果您只需操作E164数字,就不必这样做
    • 电话号码可以包含空格或括号。这很荒谬,因为它只是电话号码的文本表示形式。您不应该将其存储,因为人们可能对不同的数字组有不同的个人偏好(
      -
      ,等等)

    如果你想进行验证和规范化,你可能需要依赖一个库来为你正确地进行验证和规范化。这是最常见的选择之一。

    @Raze2dust:在这种情况下不需要任何代码。@Jon我的意思是,它显示一个随机数。如果它显示的数字带有前导零,这是可以理解的被截断了,但是是一个随机数?我需要看看代码来解决这个问题。@Raze2dust:嗯,不是“随机的”——而是将它存储在一个
    双精度文件中Order order1 = new PickUpOrder(orderTime, 0473519954); 
    //The pickup order requires an orderTime (String) and a contact number(Int). Heres    
    //the constructor for PickUpOrder. 
    
    public PickUpOrder(Date orderTime, String number) 
    { 
        discount = .2; 
        phoneNumber = number; 
        super.setOrderTime(orderTime); 
        //Test print 
        System.out.println(phoneNumber) 
        //reads int as 74049273 instead of 0473519954 
    }
    
    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;
        }
    }