我们应该使用什么原始或什么类型来表示java中的电话号码?

时间:2009-06-12 03:16:21

标签: java types

哪种类型可以包含像java中的2023209999这样的数字? 你认为使用字符串类型来表示电话号码是一个好主意吗?

11 个答案:

答案 0 :(得分:28)

使用字符串是一个非常好的主意。请记住,OOP的重点是不同类型的数据具有不同的使用模式。那么让我们看一下电话号码模式。

  • 我们是否添加电话号码或对其执行其他算术?
  • 我们是根据长度分割它,与它的部分匹配,更换它的一部分吗?

第一个问题的答案是否定的。所以我们不像数字那样操纵它们。第二个问题的答案是肯定的,所以我们像字符串一样操纵它们。

现在,许多人都在倡导将手机本身作为一个类别。在这方面有优点,但我正在解决你如何存储电话号码这一更紧迫的问题,无论手机是否是一个班级,这都是你需要做的事情。将数据存储为数字的电话类不太适合。

答案 1 :(得分:9)

我会写一个PhoneNumber类,它使用String作为底层存储,并添加验证/漂亮的格式化功能。

答案 2 :(得分:4)

我至少会说一个String,但就个人而言,我会创建一个PhoneNumber对象。这种方式可以提供额外的方法,例如:

 boolean isValid();

 PhoneNumberUtils.getCountry(PhoneNumber number);
 PhoneNumberUtils.getState(PhoneNumber number);

......或者其他什么。我要考虑的一件事就是让人们输入电话号码并让系统学习其余部分。我鄙视输入可由系统确定的数据。这只是我的偏好。

在一个更简单的层面上,只需将字符串封装在一个PhoneNumber对象中就可以让你的大脑有一个句柄......大概一周左右,当你的大脑想知道“这个电话号码方法应该去哪里?”时,你可能会发现自己有一个快速回答。

答案 3 :(得分:2)

我认为专用的PhoneNumber课程是实现它的方法。电话号码不仅仅是字符串。首先,电话号码遵守规则,例如:它们只包含数字,在美国,它们可以包含7或10位数字。你需要一个构造函数来确保你的电话号码是正确的。

其次,课程将使您轻松地分清各种格式之间的差异。例如,555-4834和5554834是不同的字符串,但电话号码相同。

最后,您可能需要以下方法:getAreaCode()或getLocalNumber()调用这样的方法比直接操作String更简洁,更不容易出错:

String phoneNumber pn = ....;
String localNumber = pn.length() == 7 ? pn : pn.substring(4) : 

答案 4 :(得分:2)

现在已经很晚了,但我可能会增加2美分......

我在电信行业,并且已经将电话号码存储在具有可变长度字符成员的结构(或对象)中的最佳经验,即

struct TelephoneNumber (
    InternationalPrefix VARCHAR;
    AreaCode VARCHAR;
    Subscriber VARCHAR;
    Extension VARCHAR;)

我从不存储访问数字(零,双零,加号等),它们不属于电话号码本身,但是我称之为“拨号规则”的一部分

struct DialingRule (
    International VARCHAR;
    National VARCHAR;
    Local VARCHAR;)

DialingRule的典型值为“00”,“0”,直线为NULL,“000”,“00”,“0”为PBX需要“0获取线”

“显示”一个数字,你可以自由地格式化对象,插入连字符,括号或任何你想要的东西

创建可拨号序列我通过比较FROM和TO编号的相应元素来确定类型(国际,国家或本地),并将拨号规则集中的相应字符串添加为前缀。

这听起来像是一种矫枉过正,但对于对数据完整性有强烈要求且与硬件有强大联系的国际应用程序,我没有提出更好的建议。当你想操纵数字时,它消除了模糊性和硬编码长度等的需要。从包含ISO国家代码,IATA城市代码及其相应前缀的国家/城市查找表中预填充部分结构也很容易。

祝你好运 拾音

答案 5 :(得分:1)

在德国,区域代码以0开头,因此整数表示将丢失该信息。

我仍然不建议只使用字符串 而是使用Phonenumber类(或接口和实现)。这种方法有一些优点 如果在某些时候你发现String不够,你只需要改变Phonenumber类而不是每个使用Phonenumbers的类。
此外,它允许您在内部分隔区号和数字。

答案 6 :(得分:0)

如果您需要记录前导0或+为国际,那么您应该使用字符串。 如果你不担心这些,你可以使用很长时间。 e.g。

long phoneNumber = 2023209999L; // the L is for a long constant.

答案 7 :(得分:0)

老实说,你可以归结为你打算用它做什么。假如我们正在处理美国的数字,如果你只是想存储它来重新打印一个字符串,甚至可能很长一段时间。

如果你想做一些更复杂的事情,使一个包含几个字符串的类,每个组件一个。

基本上没有足够的信息来做出真正的决定。

答案 8 :(得分:0)

使用String类型可以让您在没有任何伏都教或强制转换的情况下拆分电话号码。

例如,如果您更改接受电话号码的格式,则必须执行额外的工作才能将电话号码与long而不是string联系起来。

答案 9 :(得分:0)

要考虑的另一件事:int太小了。 int可容纳的最大值为2,147,483,647。就原始人而言,long是你最好的选择。

答案 10 :(得分:0)

这取决于你在做什么。假设您希望能够表示国际号码,本地号码,分支交换号码等。在这种情况下,String是一个糟糕的选择。它没有任何元信息。您可能希望课程代表电话号码。

就您用来表示此课程中的电话号码而言,您可以使用BigInteger(允许您拥有国际号码),或者更简单地说,您可以将电话号码的每个部分存储为长号。