What's the right way to represent phone numbers?
Use String
. Aside from anything else, you won't be able to store leading zeroes if you use integers. You definitely shouldn't use int
(too small) float
or double
(too much risk of data loss - see below); long
or BigInteger
could be appropriate (aside from the leading zeroes problem), but frankly I'd go with String
. That way you can also store whatever dashes or spaces the user has entered to make it easier to remember the number, if you want to.
In terms of the "data loss" mentioned above for float
and double
- float
definitely doesn't have enough precision; double
could work if you're happy that you'll never need more than 16 digits (a couple fewer than you get with long
) but you would need to be very, very careful that anywhere you convert the value back from double
to string
, you got the exact value. Many formatting conversions will give you an approximation which may be accurate to, say, 10 significant digits - but you'd want an exact integer. Basically, using floating point for phone numbers is a fundamentally bad idea. If you have to use a fixed-width numeric type, use a long
, but ideally, avoid it entirely.
Think about this: Is a phone number really a number? Does it make sense adding (or make another arithmetic operation) with phone numbers? Phone numbers are codes, they're usually represented with numbers, but that's just a convention and, maybe, in another country the use letters too (I've just realized, what about international phone numbers? they have a +
at the beginning.
You have to think about the nature of the things you want to represent, and then, find the most suitable representation.
Create your own PhoneNumber class with a private field of type String to represent it.
public class PhoneNumber {
private String number;
public PhoneNumber(String number) {
//check validity of number
this.number = number;
}
//getter, comparator, etc...
}
You could also represnt the number with long or BigInteger if all phone numbers have the same length, but be careful with leading zeros.
A phone number is not really an integer (or a string). It is something else which shuld have a class of its own.
EDIT: one more thing: I wouldn't implement a setter for this class because a phone number object would better be immutable