У меня проблемы с представлением номера мобильного телефона в одном из моих приложений. В настоящее время, когда я пытаюсь использовать представление телефонного номера с целыми числами, удваивает длинные, я, кажется, храню случайные числа, а не числа, которые я намеревался хранить.
Используйте Строку
. Помимо всего прочего, вы не сможете хранить ведущие нули, если используете целые числа. Вы определенно не должны использовать int
(слишком маленький) float
или double
(слишком большой риск потери данных - см. Ниже); long
или BigInteger
могли бы быть подходящими (помимо проблемы с начальными нулями), но, честно говоря, я бы выбрал String
. Таким образом, вы можете также сохранить любые дефисы или пробелы, введенные пользователем, чтобы упростить запоминание числа, если хотите.
С точки зрения упомянутой выше «потери данных» для float
и double
- float
определенно не имеет достаточной точности; double
мог бы работать, если вы счастливы, что вам никогда не понадобится больше 16 цифр (на пару меньше, чем вы получите с long
), но вам нужно будет очень , очень осторожно, чтобы где бы вы ни преобразовали значение обратно из double
в строку
, вы получили точное значение. Многие преобразования форматирования дадут вам приближение, которое может быть точным, скажем, до 10 значащих цифр, но вам нужно точное целое число. По сути, использование чисел с плавающей запятой для телефонных номеров - принципиально плохая идея. Если у вас есть для использования числового типа с фиксированной шириной, используйте long
, но в идеале полностью избегайте его.
Каждое число имеет бесконечное количество нулей слева и справа,
Чтобы представить его, вы должны использовать форматирование строки
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 % [аргумент_индекс $] [флаги] [ширина] [. точность] преобразование
флаг 0 - заполнение нулями 10 - количество заполняющих нулей d - десятичное целое
Реализация интерфейса Comparable дает вам возможность сортировать список.
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
Подумайте вот о чем: действительно ли номер телефона является числом? Есть ли смысл складывать (или производить еще одну арифметическую операцию) с номерами телефонов? Телефонные номера - это коды, они обычно представлены цифрами, но это просто соглашение и, возможно, в другой стране также используются буквы (я только что понял, а как насчет международных телефонных номеров? У них есть +
в начале.
Вы должны подумать о природе вещей, которые вы хотите изобразить, а затем найти наиболее подходящее представление.
Хотя телефонные номера являются именованными номерами, обычно это не цифры (например, начальные нули, префикс страны + XX, ...).
Таким образом, есть две возможности правильно представить телефонный номер в программе:
String
, чтобы сохранить весь номер, как введенный. Использование настраиваемого типа данных, который предлагает дополнительную поддержку функций телефонных номеров.
открытый класс PhoneNumber реализует Comparable {
private String countryCode;
частный String areaCode;
private String subscriberNumber;
// Конструктор (ы)
// Геттер
// HashCode + Equals
// по сравнению с
@Override
public String toString () {
вернуть код страны + "" + areaCode + "" + subscriberNumber;
}
}
Действительно интересно посмотреть на все различные соглашения, которые используются во всем мире
Вы должны использовать строку для поддержки чисел с ведущими нулями. Код, который вы предоставили, был:
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 произошла ошибка компиляции. Это тот же код, который вы скомпилировали?
Создайте свой собственный класс PhoneNumber с приватным полем типа String для его представления.
public class PhoneNumber {
private String number;
public PhoneNumber(String number) {
//check validity of number
this.number = number;
}
//getter, comparator, etc...
}
Вы также можете представить номер с помощью long или BigInteger, если все телефонные номера имеют одинаковую длину, но будьте осторожны с ведущими нулями.
Номер телефона на самом деле не является целым числом (или строкой). Это нечто иное, что должно иметь свой собственный класс.
РЕДАКТИРОВАТЬ: Еще одна вещь: я бы не стал реализовывать сеттер для этого класса, потому что объект телефонного номера лучше сделать неизменяемым