我无法在我的某个应用程序中代表手机号码。
我想知道是否有一个Integer类允许你存储从0417254482开始的这样一个数字。也许使用字符串更合适? 目前,当我尝试使用代表一个带有整数的电话号码时,我看起来多了两倍,而不是我想存储的数字。
答案 0 :(得分:109)
使用String
。除了其他任何东西,如果你使用整数,你将无法存储前导零。您肯定不应使用int
(太小)float
或double
(数据丢失的风险太大 - 见下文); long
或BigInteger
可能是合适的(除了领先的零问题),但坦率地说,我会选择String
。这样你就可以还存储用户输入的任何破折号或空格,以便更容易记住号码,如果你愿意的话。
就上面提到的float
和double
的“数据丢失”而言,float
肯定没有足够的精确度; double
可以工作,如果你很高兴你永远不会需要超过16位数(比long
少一些),但你需要非常,非常小心,无论您将值从double
转换回string
,您都会得到确切的值。许多格式转换会为您提供一个近似值,可能精确到10位有效数字 - 但您需要一个精确的整数。基本上,使用浮点电话号码是一个根本不好的主意。如果 使用固定宽度的数字类型,请使用long
,但理想情况下,请完全避免使用。{/ p>
答案 1 :(得分:35)
想一想:电话号码真的是一个号码吗?使用电话号码添加(或进行其他算术运算)是否有意义?电话号码是代码,它们通常用数字表示,但这只是一个惯例,也许,在另一个国家也使用字母(我刚刚意识到,国际电话号码怎么样?他们有+
在开始。
你必须考虑你想要表达的事物的性质,然后找到最合适的表示。
答案 2 :(得分:3)
使用String类型的私有字段创建自己的PhoneNumber类来表示它。
public class PhoneNumber {
private String number;
public PhoneNumber(String number) {
//check validity of number
this.number = number;
}
//getter, comparator, etc...
}
如果所有电话号码具有相同的长度,您也可以使用long或BigInteger来重新编号,但要注意前导零。
电话号码实际上不是整数(或字符串)。这是其他一些有自己一类的东西。
编辑: 还有一件事:我不会为这个类实现一个setter,因为电话号码对象最好是不可变的
答案 3 :(得分:3)
虽然电话号码是指定号码,但通常不是号码(例如前导零,国家/地区前缀+ 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;
}
}
答案 4 :(得分:3)
如果您要进行验证和规范化,则可能需要依赖为您正确执行此操作的库。 https://github.com/googlei18n/libphonenumber是最常用的选项之一。
答案 5 :(得分:2)
您应该使用字符串或更专业的数据结构。
主要原因是您可以对电话号码执行的操作是词典,而不是算术。
例如您可以说法国的电话号码以+33
开头,但您不能假设它们在数字范围内。
这些其他论点在我看来无效
*
或#
。这些符号可以通过电话线传输,但它们不是电话号码本身的一部分,我认为它超出了范围。+
开头只是E164数字的表示,因此可以将它们与本地数字区分开来。如果你只操纵E164数字,他们真的没必要。.
,-
,
等。)。答案 6 :(得分:0)
每个数字在左侧和右侧都有无穷大的零,
要表示它,您应该使用字符串格式化
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] [标志] [宽度] [精度]换算
标志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
答案 7 :(得分: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中一定存在编译错误。这是你编译的相同代码吗?