我在我的应用程序中遇到了表示手机号码的问题。
我想知道是否有一种整数类可以存储以0417254482开头的这样一个号码。也许使用字符串更为适当? 目前,我尝试使用int、double、long等类型来表示电话号码时,似乎会存储随机数字而不是我要存储的数字。
我在我的应用程序中遇到了表示手机号码的问题。
我想知道是否有一种整数类可以存储以0417254482开头的这样一个号码。也许使用字符串更为适当? 目前,我尝试使用int、double、long等类型来表示电话号码时,似乎会存储随机数字而不是我要存储的数字。
使用String
。除此之外,如果你使用整数,你将无法存储前导零。你绝对不应该使用int
(太小)、float
或double
(数据丢失的风险太大-见下文);long
或BigInteger
可能是适当的选择(除了前导零问题),但坦率地说我会选择String
。这样你还可以存储用户输入的任何破折号或空格,以便更容易记住号码。
至于上述提到的float
和double
的“数据丢失”问题- float
绝对没有足够的精度;double
可以工作,如果你确信你永远不需要超过16个数字(比long
少两个),但你需要非常非常小心,在任何地方将值从double
转换回string
时,你得到的是确切的值。许多格式转换将给你一个约等于10个有效数字的近似值-但你需要一个确切的整数。基本上,对于电话号码使用浮点数是一个根本上错误的想法。如果你必须使用固定宽度的数字类型,使用long
,但理想情况下,完全避免这种情况。
想一想:电话号码真的是一个数字吗?将电话号码与数字相加(或进行其他算术运算)有意义吗?电话号码是一种代码,通常用数字表示,但这只是一种约定俗成,也许在另一个国家里使用字母。(我刚意识到,那么国际电话号码呢?它们以 +
开头。)你必须思考你想要表示的事物的本质,然后找到最合适的表示方法。
尽管电话号码被称为数字,但它们通常不是数字(例如前导零、国家前缀+XX等)。
因此,在程序内正确表示电话号码有两种可能:
String
to keep the whole number like entered.Using a custom data type that offers additional support for phone number features
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;
}
}
看各国使用的不同电话号码书写规则真是有趣。
public class PhoneNumber {
private String number;
public PhoneNumber(String number) {
//check validity of number
this.number = number;
}
//getter, comparator, etc...
}
如果所有电话号码长度相同,您还可以使用long或BigInteger表示数字,但要小心前导零。
电话号码实际上不是整数(或字符串)。它应该有自己的类。
编辑:还有一件事:我不会为这个类实现setter,因为电话号码对象最好是不可变的。
+33
开头,但你不能假设它们在一个数字范围内。*
或#
。这些符号可以通过电话线传输,但它们不是电话号码本身的一部分,我认为这超出了范围。+
开头只是E164号码的一种表示形式,以便它们可以与本地号码区分开来。如果你只处理E164号码,它们真的不必这样做。.
、-
、
等)。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<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
你应该使用字符串来支持带前导零的数字。你提供的代码是:
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
}
我建议不要使用原始数据类型。
原因:原始数据类型无法接受特殊字符,例如+、-、(、)和&。如果您接受此格式的电话号码+1(xxx)-xxx-xxxx。
double
中肯定会丢失数据。 - Jon Skeet