题
我在我的一个应用程序中代表一个手机号码时遇到困难。
我想知道是否有一个整数类,可以让您存储以0417254482开头的数字。也许使用字符串更合适?目前,当我尝试使用带有ints的电话号码时,dubles longs我似乎存储随机数,而不是我要存储的数字。
解决方案
采用 String
. 。除其他任何内容外,如果您使用整数,您将无法存储领先的零。你 确实 不应该使用 int
(太小) float
或者 double
(数据丢失的风险太多 - 见下文); long
或者 BigInteger
可能是适当的(除了领先的零问题),但坦率地说 String
. 。这样你就可以 还 存储用户输入的任何破折号或空格,以使您可以更轻松地记住数字(如果需要)。
关于上面提到的“数据丢失” float
和 double
- float
绝对没有足够的精度; double
可以 工作如果您很高兴您永远不需要16位数字(比您所获得的少数几位 long
)但是,您需要非常非常小心,以使您从中转换回值 double
到 string
, ,您得到了确切的价值。许多格式化转换将为您提供一个近似值,例如10个重要数字,但您需要一个确切的整数。基本上,将浮点用于电话号码是一个根本不好的主意。如果你 有 要使用固定宽度数字类型,请使用 long
, ,但理想情况下,完全避免了它。
其他提示
考虑一下:电话号码真的是一个号码吗?使用电话号码添加(或进行另一个算术操作)是否有意义?电话号码是代码,通常以数字为代表,但这只是一个惯例,也许在另一个国家也是使用字母(我刚刚意识到,国际电话号码呢?他们有一个 +
在开始。您必须考虑要代表的事物的性质,然后找到最合适的表示形式。
尽管电话号码是命名号,但通常不是数字(例如领导零,国家前缀 +xx,...)。
因此,有两种可能在程序中正确表示电话号码:
- 使用
String
保持整个数字如输入。 使用为电话号码功能提供额外支持的自定义数据类型
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