Java 什么';代表电话号码的正确方法是什么?
我在一个应用程序中表示手机号码时遇到问题 我想知道是否有一个Integer类允许您存储这样一个从0417254482开始的数字。也许使用字符串更合适?Java 什么';代表电话号码的正确方法是什么?,java,integer,phone-number,Java,Integer,Phone Number,我在一个应用程序中表示手机号码时遇到问题 我想知道是否有一个Integer类允许您存储这样一个从0417254482开始的数字。也许使用字符串更合适? 目前,当我试图用int、double long来表示电话号码时,我似乎存储的是随机数,而不是我想存储的数字。使用字符串。除此之外,如果使用整数,您将无法存储前导零。您绝对不应该使用int(太小)float或double(数据丢失的风险太大-见下文)long或biginger可能是合适的(除了前导零问题),但坦率地说,我会选择String。这样,您
目前,当我试图用int、double long来表示电话号码时,我似乎存储的是随机数,而不是我想存储的数字。使用
字符串
。除此之外,如果使用整数,您将无法存储前导零。您绝对不应该使用int
(太小)float
或double
(数据丢失的风险太大-见下文)long
或biginger
可能是合适的(除了前导零问题),但坦率地说,我会选择String
。这样,您还可以存储用户输入的任何破折号或空格,以便更容易记住数字(如果需要)
就上面提到的
float
和double
-float
的“数据丢失”而言,肯定没有足够的精度<代码>双精度可以工作,如果您很高兴您永远不需要超过16位数字(比long
少几个),但是您需要非常非常小心,无论您在哪里将值从双精度
转换回字符串
,都可以得到准确的值。许多格式转换将为您提供一个近似值,该近似值可能精确到(比如)10位有效数字,但您需要一个精确的整数。基本上,对电话号码使用浮点从根本上说是个坏主意。如果必须使用固定宽度的数字类型,请使用长的
,但理想情况下,应完全避免使用它。每个数字的左右两侧都有无穷多的零
要表示它,应该使用字符串格式化
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());
}
}
创建您自己的PhoneNumber类,其中包含一个字符串类型的私有字段来表示它
public class PhoneNumber {
private String number;
public PhoneNumber(String number) {
//check validity of number
this.number = number;
}
//getter, comparator, etc...
}
如果所有电话号码的长度相同,也可以用long或biginger表示数字,但要注意前导零
电话号码实际上不是整数(或字符串)。它是另外一种东西,应该有自己的类别
编辑:
还有一件事:我不会为这个类实现setter,因为电话号码对象最好是不可变的您应该使用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
}
在构造函数中,数字是字符串,但当您调用构造函数时,您使用int作为电话号码。我认为java中一定有编译错误。这与您编译的代码相同吗?想想看:电话号码真的是一个号码吗?把电话号码加起来(或做另一个算术运算)有意义吗?电话号码是代码,通常用数字来表示,但这只是一种惯例,可能在另一个国家也使用字母(我刚刚意识到,国际电话号码呢?它们一开始就有一个
+
)。
您必须考虑要表示的内容的性质,然后找到最合适的表示形式。虽然电话号码是命名号码,但通常不是号码(例如,前导零、国家前缀+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实现可比较{
私有字符串国家代码;
专用字符串区域码;
私有字符串subscriberNumber;
//建造商
//吸气剂
//HashCode+等于
//比较
@凌驾
公共字符串toString(){
返回国家代码+“”+地区代码+“”+下标编号;
}
}
查看所有不同的非常有趣,您应该使用字符串或更专业的数据结构 主要原因是,你可以对电话号码进行的运算是字典式的,而不是算术运算。 e、 g.你可以说法国的电话号码以
+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
}
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;
}
}