Подтвердить что ты не робот

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

У меня возникли проблемы с представлением мобильного номера в одном из моих приложений.

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

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

EDIT: еще одна вещь: я бы не реализовал сеттер для этого класса, потому что объект номера телефона был бы более неизменным

Ответ 4

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

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

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

    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;
        }
    }
    

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

Ответ 5

Если вы хотите провести валидацию и нормализацию, вы, вероятно, захотите использовать библиотеку, которая сделает это за вас. https://github.com/googlei18n/libphonenumber - один из самых распространенных вариантов.

Ответ 6

Вы должны использовать строку или более специализированную структуру данных.

Основная причина заключается в том, что операции, которые вы можете выполнять по телефонным номерам, являются лексикографическими, а не арифметическими. например Вы можете сказать, что номера телефонов для Франции начинаются с +33, но вы не можете предположить, что они находятся в числовом диапазоне.

Эти другие аргументы недействительны, на мой взгляд,

  • номер телефона может включать * или #. Эти символы могут переноситься по телефонным линиям, но они не являются частью самого номера телефона, и я считаю, что это не в полном объеме.
  • номер телефона может начинаться с начальных нулей. Местные номера телефонов могут, но они являются ограниченным представительством в первую очередь. Международные телефонные номера начинаются с кода страны, и ни один из них не имеет начального нуля. Следовательно, международный номер телефона не имеет ведущих нулей.
  • номер телефона начинается с+. Число может прекрасно представлять это, просто будучи положительным. Также, начиная с +, это просто представление чисел E164, поэтому их можно отличить от локальных чисел. Им действительно не нужно, если вы управляете только номерами E164.
  • номер телефона может содержать пробелы или круглые скобки. Это абсурдно, потому что это просто текстовое представление числа. Вы не должны хранить это, так как люди могут иметь разные личные предпочтения для разделения групп цифр (., -, и т.д.).

Ответ 7

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

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

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 % [Argument_index $] [флаги] [ширина] [. Точность] преобразования

флаг 0 - прописные нули 10 - количество нулей d - десятичное целое число

Реализация интерфейса Comparable дает вам возможность сортировать List.

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

Ответ 8

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

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