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

时间:2010-08-14 11:58:45

标签: java integer phone-number

我无法在我的某个应用程序中代表手机号码。

我想知道是否有一个Integer类允许你存储从0417254482开始的这样一个数字。也许使用字符串更合适? 目前,当我尝试使用代表一个带有整数的电话号码时,我看起来多了两倍,而不是我想存储的数字。

8 个答案:

答案 0 :(得分:109)

使用String。除了其他任何东西,如果你使用整数,你将无法存储前导零。您肯定不应使用int(太小)floatdouble(数据丢失的风险太大 - 见下文); longBigInteger可能是合适的(除了领先的零问题),但坦率地说,我会选择String。这样你就可以存储用户输入的任何破折号或空格,以便更容易记住号码,如果你愿意的话。

就上面提到的floatdouble的“数据丢失”而言,float肯定没有足够的精确度; double 可以工作,如果你很高兴你永远不会需要超过16位数(比long少一些),但你需要非常,非常小心,无论您将值从double转换回string,您都会得到确切的值。许多格式转换会为您提供一个近似值,可能精确到10位有效数字 - 但您需要一个精确的整数。基本上,使用浮点电话号码是一个根本不好的主意。如果 使用固定宽度的数字类型,请使用long,但理想情况下,请完全避免使用。{/ p>

答案 1 :(得分:35)

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

答案 2 :(得分:3)

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

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

如果所有电话号码具有相同的长度,您也可以使用long或BigInteger来重新编号,但要注意前导零。

电话号码实际上不是整数(或字符串)。这是其他一些有自己一类的东西。

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

答案 3 :(得分:3)

虽然电话号码是指定号码,但通常不是号码(例如前导零,国家/地区前缀+ 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;
        }
    }
    
  3. 查看所有不同的conventions that are used internationally

    非常有趣

答案 4 :(得分:3)

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

答案 5 :(得分:2)

您应该使用字符串或更专业的数据结构。

主要原因是您可以对电话号码执行的操作是词典,而不是算术。 例如您可以说法国的电话号码以+33开头,但您不能假设它们在数字范围内。

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

  • 电话号码可以包含*# 。这些符号可以通过电话线传输,但它们不是电话号码本身的一部分,我认为它超出了范围。
  • 电话号码可以从前导零开始。本地电话号码可以,但它们首先是有限的代表。国际电话号码以国家代码开头,并且没有一个具有前导零。因此,没有国际电话号码有前导零。
  • 电话号码以+ 开头。一个数字可以完美地代表这一点,仅仅是积极的。同样以+开头只是E164数字的表示,因此可以将它们与本地数字区分开来。如果你只操纵E164数字,他们真的没必要。
  • 电话号码可以包含空格或括号。这是荒谬的,因为它只是数字的文本表示。您不应该存储此内容,因为人们可以将不同的个人偏好设置为单独的数字组(.-等。)。

答案 6 :(得分:0)

每个数字在左侧和右侧都有无穷大的零,

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

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());
    }
}

使用%010d表示 %[$的argument_index] [标志] [宽度] [精度]换算

标志0 - 填充零 10 - 填充零的数量 d - 十进制整数

接口Comparable的实现为您提供了对List进行排序的可能性。

List<PhoneNumber> phoneNumbers = new ArrayList();
 phoneNumbers.add(new PhoneNumber (123L);
 phoneNumbers.add(new PhoneNumber (123777L);
 phoneNumbers.add(new PhoneNumber (125L);
 phoneNumbers.add(new PhoneNumber (124L);
 phoneNumbers.add(new PhoneNumber (126L);

Collections.sort(phoneNumbers);

  for(PhoneNumber phoneNumber : phoneNumbers) {
   System.Console.Out.WriteLine(phoneNumber);
  }

输出

 0000000000 
 0000000123
 0000000124
 0000000125
 0000000126
 0000123777

Comparable String Formatter

答案 7 :(得分:0)

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

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中一定存在编译错误。这是你编译的相同代码吗?