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