54

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

我想知道是否有一个 Integer 类可以让您存储以 0417254482 开头的数字。也许使用字符串更合适?目前,当我尝试使用整数表示电话号码时,我似乎存储的是随机数而不是我打算存储的数字。

4

8 回答 8

136

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

就上面提到的“数据丢失”而言float-double绝对float没有足够的精度;如果你很高兴你永远不需要超过 16 位数字(比你得到的数字少几个),那么你可以工作,double long你需要非常非常小心,无论你将值从什么转换doublestring价值。许多格式转换将为您提供一个近似值,该近似值可能精确到 10 位有效数字 - 但您需要一个精确的整数。基本上,对电话号码使用浮点是一个根本性的坏主意。如果您必须使用固定宽度的数字类型,请使用 a long,但最好完全避免使用它。

于 2010-08-14T12:01:15.967 回答
43

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

于 2010-08-14T12:16:59.023 回答
5

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

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

如果所有电话号码的长度相同,您也可以使用 long 或 BigInteger 表示该号码,但请注意前导零。

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

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

于 2010-08-14T12:10:26.270 回答
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;
        }
    }
    

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

于 2010-08-14T17:38:51.203 回答
4

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

于 2018-07-05T12:42:17.603 回答
2

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

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

我认为这些其他论点无效

  • 电话号码可以包括*#。这些符号可以在电话线上传输,但它们不是电话号码本身的一部分,我认为它超出了范围。
  • 电话号码可以以前导零开头。本地电话号码可以,但它们首先是有限的代表。国际电话号码以国家代码开头,并且没有一个前导零。因此,没有国际电话号码有前导零。
  • 电话号码以 + 开头。一个数字可以完美地代表这一点,只要是积极的。同样开头+的只是 E164 号码的表示,以便可以将它们与本地号码区分开来。如果您只操作 E164 号码,他们真的不必这样做。
  • 电话号码可以包含空格或括号。这是荒谬的,因为它只是数字的文本表示。您不应该存储它,因为人们可能有不同的个人偏好来分隔数字组(.-等)。
于 2015-12-04T14:59:05.497 回答
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中一定存在编译错误。这与您编译的代码相同吗?

于 2010-08-14T12:13:32.147 回答
-1

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

为了表示它,您应该使用字符串格式

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$][flags][width][.precision]conversion

标志 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

可比 字符串格式化程序

于 2010-08-14T12:02:36.333 回答