Как правильно представлять номера телефонов?

У меня проблемы с представлением номера мобильного телефона в одном из моих приложений. В настоящее время, когда я пытаюсь использовать представление телефонного номера с целыми числами, удваивает длинные, я, кажется, храню случайные числа, а не числа, которые я намеревался хранить.

43
задан Elias Zamaria 8 June 2018 в 23:54
поделиться

6 ответов

Используйте Строку . Помимо всего прочего, вы не сможете хранить ведущие нули, если используете целые числа. Вы определенно не должны использовать int (слишком маленький) float или double (слишком большой риск потери данных - см. Ниже); long или BigInteger могли бы быть подходящими (помимо проблемы с начальными нулями), но, честно говоря, я бы выбрал String . Таким образом, вы можете также сохранить любые дефисы или пробелы, введенные пользователем, чтобы упростить запоминание числа, если хотите.

С точки зрения упомянутой выше «потери данных» для float и double - float определенно не имеет достаточной точности; double мог бы работать, если вы счастливы, что вам никогда не понадобится больше 16 цифр (на пару меньше, чем вы получите с long ), но вам нужно будет очень , очень осторожно, чтобы где бы вы ни преобразовали значение обратно из double в строку , вы получили точное значение. Многие преобразования форматирования дадут вам приближение, которое может быть точным, скажем, до 10 значащих цифр, но вам нужно точное целое число. По сути, использование чисел с плавающей запятой для телефонных номеров - принципиально плохая идея. Если у вас есть для использования числового типа с фиксированной шириной, используйте long , но в идеале полностью избегайте его.

117
ответ дан 26 November 2019 в 22:25
поделиться

Каждое число имеет бесконечное количество нулей слева и справа,

Чтобы представить его, вы должны использовать форматирование строки

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

Comparable String Formatter

-1
ответ дан 26 November 2019 в 22:25
поделиться

Подумайте вот о чем: действительно ли номер телефона является числом? Есть ли смысл складывать (или производить еще одну арифметическую операцию) с номерами телефонов? Телефонные номера - это коды, они обычно представлены цифрами, но это просто соглашение и, возможно, в другой стране также используются буквы (я только что понял, а как насчет международных телефонных номеров? У них есть + в начале. Вы должны подумать о природе вещей, которые вы хотите изобразить, а затем найти наиболее подходящее представление.

36
ответ дан 26 November 2019 в 22:25
поделиться

Хотя телефонные номера являются именованными номерами, обычно это не цифры (например, начальные нули, префикс страны + XX, ...).

Таким образом, есть две возможности правильно представить телефонный номер в программе:

  1. Использование String , чтобы сохранить весь номер, как введенный.
  2. Использование настраиваемого типа данных, который предлагает дополнительную поддержку функций телефонных номеров.

     открытый класс PhoneNumber реализует Comparable  {
    
    private String countryCode;
    
    частный String areaCode;
    
    private String subscriberNumber;
    
     // Конструктор (ы)
    
     // Геттер
    
     // HashCode + Equals
    
     // по сравнению с
    
     @Override
    public String toString () {
    вернуть код страны + "" + areaCode + "" + subscriberNumber;
     }
    }
    

Действительно интересно посмотреть на все различные соглашения, которые используются во всем мире

4
ответ дан 26 November 2019 в 22:25
поделиться

Вы должны использовать строку для поддержки чисел с ведущими нулями. Код, который вы предоставили, был:

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 произошла ошибка компиляции. Это тот же код, который вы скомпилировали?

0
ответ дан 26 November 2019 в 22:25
поделиться

Создайте свой собственный класс PhoneNumber с приватным полем типа String для его представления.

public class PhoneNumber {
   private String number;
   public PhoneNumber(String number) {
      //check validity of number
      this.number = number;
   }
   //getter, comparator, etc...
}

Вы также можете представить номер с помощью long или BigInteger, если все телефонные номера имеют одинаковую длину, но будьте осторожны с ведущими нулями.

Номер телефона на самом деле не является целым числом (или строкой). Это нечто иное, что должно иметь свой собственный класс.

РЕДАКТИРОВАТЬ: Еще одна вещь: я бы не стал реализовывать сеттер для этого класса, потому что объект телефонного номера лучше сделать неизменяемым

3
ответ дан 26 November 2019 в 22:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: