我在我的一个应用程序中代表一个手机号码时遇到困难。

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

有帮助吗?

解决方案

采用 String. 。除其他任何内容外,如果您使用整数,您将无法存储领先的零。你 确实 不应该使用 int (太小) float 或者 double (数据丢失的风险太多 - 见下文); long 或者 BigInteger 可能是适当的(除了领先的零问题),但坦率地说 String. 。这样你就可以 存储用户输入的任何破折号或空格,以使您可以更轻松地记住数字(如果需要)。

关于上面提到的“数据丢失” floatdouble - float 绝对没有足够的精度; double 可以 工作如果您很高兴您永远不需要16位数字(比您所获得的少数几位 long)但是,您需要非常非常小心,以使您从中转换回值 doublestring, ,您得到了确切的价值。许多格式化转换将为您提供一个近似值,例如10个重要数字,但您需要一个确切的整数。基本上,将浮点用于电话号码是一个根本不好的主意。如果你 要使用固定宽度数字类型,请使用 long, ,但理想情况下,完全避免了它。

其他提示

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

尽管电话号码是命名号,但通常不是数字(例如领导零,国家前缀 +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;
        }
    }
    

看到所有不同的东西真的很有趣 国际使用的约定

使用类型字符串的私有字段来创建自己的Phonenumber类来表示它。

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

如果所有电话号码的长度相同,则也可以代表长或biginteger的数字,但要小心领先的零。

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

编辑:另一件事:我不会为此类实施设置程序,因为电话号码对象最好是不可变的

如果您想进行验证和归一化,则可能要依靠适当地适合您的库。 https://github.com/googlei18n/libphonenumber 是最常见的选择之一。

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

主要原因是您可以在电话号码上执行的操作是词典,而不是算术。例如,您可以说法国的电话号码从 +33, ,但是您不能认为它们处于数值范围内。

我认为这些其他论点无效

  • 电话号码可以包括 * 或者 #. 。该符号可以在电话线上运输,但它们不是电话号码本身的一部分,我认为它不超出范围。
  • 电话号码可以从领先的零开始. 。本地电话号码可以,但首先是有限的表示。国际电话号码以国家代码开头,没有一个领先的零。因此,没有国际电话号码有领先的零。
  • 电话号码以 +开头. 。一个数字可以简单地成为积极来完美地代表这一点。也从 + 只是E164数字的表示形式,因此可以将其与本地数字区分开。如果您只操纵E164号码,他们确实不必这样做。
  • 电话号码可以包含空格或括号. 。这是荒谬的,因为它只是数字的文本表示。您不应该存储它,因为人们可以有不同的个人喜好来分开数字(., -, , , ETC。)。

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

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中一定有一个编译错误。这与您编译的代码相同吗?

每个数字在左侧和右侧都有无限量的零,

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

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平均%[gright_index $] [flags] [width] [。precision]转换

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

接口的实现可与您的排序列表相提并论。

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

可比 字符串格式

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top