什么是正确的方式来表示电话号码?
在我的某个应用程序中,我无法代表手机号码。
我想知道是否有一个Integer类可以让你存储这样一个以0417254482开头的数字。也许使用一个string更合适一些? 目前,当我试图使用代表一个电话号码与整数,加倍多头,我似乎存储随机数字,而不是我打算存储的数字。
使用String
。 除此之外,如果使用整数,则不能存储前导零。 你绝对不应该使用int
(太小) float
或double
(太多的数据丢失风险 – 见下文); long
或BigInteger
可能是合适的(除了领先的零问题),但坦率地说,我会去与String
。 这样,您也可以存储用户input的任何破折号或空格,以便更容易记住该号码。
就float
和double
float
上面提到的“数据丢失”而言,绝对没有足够的精度; 如果你很高兴你永远不需要16位以上的数字,那么double
可以工作,但是你需要非常小心,无论你把值从double
转换成string
,你有确切的价值。 许多格式转换会给你一个近似值,比如10个有效数字,但是你需要一个精确的整数。 基本上,使用电话号码浮点是一个根本不好的主意。 如果您必须使用固定宽度的数字types,请使用long
数字types,但最好完全避免。
想想这个:电话号码真的是一个数字吗? 用电话号码添加(或进行另一个算术运算)是否有意义? 电话号码是代码,它们通常用数字表示,但这只是一个惯例,也可能在另一个国家使用字母(我刚刚意识到,国际电话号码呢?他们在开始的时候有一个+
号。你必须思考你想要expression的事物的本质,然后find最合适的表示。
使用Stringtypes的私有字段创build您自己的PhoneNumber类来表示它。
public class PhoneNumber { private String number; public PhoneNumber(String number) { //check validity of number this.number = number; } //getter, comparator, etc... }
如果所有电话号码的长度相同,您也可以用长或BigInteger来重新编号,但要小心前导零。
电话号码不是一个整数(或string)。 这是其他什么东西,拥有一个自己的阶级。
编辑:还有一件事:我不会为这个类实现一个setter,因为一个电话号码对象最好是不可变的
虽然电话号码是指定的号码,但通常不是号码(例如前导零,国家前缀+ XX,…)。
所以在程序中有两种可能性来正确表示电话号码:
- 使用
String
保持整个数字像input。 -
使用为电话号码function提供额外支持的自定义数据types
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; }
}
看看国际上使用的所有不同的惯例是非常有趣的
你应该使用一个string或更专门的数据结构。
主要原因是您可以对电话号码进行的操作是字典式的,而不是算术式的。 例如,你可以说法国的电话号码以+33
开头,但是你不能认为它们在数字范围内。
这些其他的论点在我看来是无效的
- 电话号码可以包括
*
或#
。 这些符号可以通过电话线传输,但它们不是电话号码本身的一部分,我认为这不在范围之内。 - 电话号码可以从前导零开始 。 本地电话号码可以,但首先是有限的代表性。 国际电话号码以国家代码开头,没有一个是前导零。 因此没有国际电话号码具有前导零。
- 电话号码以+开头 。 一个数字可以完全代表这一点,只要积极。 另外,以
+
开始只是E164号码的一种表示,所以它们可以与本地号码区分开来。 他们真的不必,如果你只操纵E164号码。 - 电话号码可以包含空格或括号 。 这是荒谬的,因为它只是数字的文本表示。 你不应该存储这个,因为人们可以有不同的个人偏好来分隔数字组(
.
,-
,等)。
您应该使用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 }
在构造函数中,数字是string,但是当你调用构造函数时,你使用了一个int来表示电话号码。 我认为在java中肯定有编译错误。 这是你编译的代码吗?
每个数字在左侧和右侧都有无限量的零,
为了表示它,你应该使用string格式化
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]转换
标志0 – 填充零10 – 填充零的数量d – 十进制整数
接口Comparable的实现给你sorting列表的可能性。
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
可比较的 string格式器