2010-08-14 2 views
33

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

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

+9

@ Raze2dust: В этом случае нет необходимости в каком-либо коде. –

+0

@ Jon Я подразумевал для части, что он отображает случайное число. Это понятно, если оно отображает число с ведущими нулями, усеченными, но случайное число? Мне нужно было бы увидеть код, чтобы решить это. –

+1

@ Raze2dust: Ну, а не «случайный» - но сохранение его в «двойном» может, конечно, потерять данные. –

ответ

94

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

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

+0

Простите мое невежество, но действительно ли какие-либо номера телефонов начинаются с нуля? –

+3

@WesleyMurch: * Все номера телефонов в Великобритании начинаются с 0. Например, код города для чтения равен 0118. –

+1

Это не ошибка Вина Коульсона, которую он неправильно редактировал в коде C#. Кто-то закрыл [версию C#] (http://stackoverflow.com/questions/17386794) этого вопроса, сказав, что это дубликат этого вопроса. Отличие между языками программирования весьма важно, ИМХО. – HappyNomad

0

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

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

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 
000000
0000000124 
0000000125 
0000000126 
000

Comparable String Formatter

+0

В коде есть несколько ошибок (отсутствующие полуколоны), но кроме того, это идеальный способ решить эту проблему. – matto1990

+0

@ matto1990 Только один ;-) но исправил все. thx –

+0

-1 Рекомендуем использовать номер. Извините @Vash за то, что вы заменили 9100 репутации на 9 098. Кроме того, зачем использовать 'class' вместо' struct'? Если структура включает данные, подобные этой, используйте 'struct'. Если он охватывает «объекты» и делает вещи (например, «Стрим»), используйте «класс». Было бы разумно, если 'int' был определен как' class Int32'? –

3

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

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

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

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

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

+0

Добавление метода compareTo и equals приведет к тому, что сортировка будет выполняться в этом вопросе. – matto1990

+0

@matto: Твой прав. Он должен реализовывать compareTo и equals. Благодарю. – snakile

+1

, если вы просто сохраняете номер в атомной строке, нет необходимости обертывать его в новый класс, поскольку все методы, такие как hashCode, ... будут по существу делегировать реализации, предоставляемые String. –

0

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

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

28

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

+0

+1 Я думаю, вы можете заменить + на 00, так что Дания (где я) 0045 XXXX XXXX. –

+0

Да. Это верно + может использоваться вместо 00 и наоборот. –

+4

Я не делаю никаких арифметических операций с идентификаторами, и все же я храню их так долго. – rds

2

Хотя номера телефонов называются номерами, они обычно не являются номерами (например, ведущие нули, префикс страны + 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; 
        } 
    

    }

Это действительно интересно посмотреть на все различные conventions that are used internationally

+0

Кроме того, это также зависит от того, насколько сложны ваши приложения. Нормальному приложению понадобится только представление String и не более того, тогда как сложные приложения для хранения адресов и выполнения запросов на них потребуют более сложной обработки. –

+0

Вы можете согласиться с тем, что номер телефона должен включать префикс страны, и в этом случае нет нулевого числа. – rds

1

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

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

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

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