Лучше ли хранить телефонные номера в каком-то каноническом формате или «как введено»? - PullRequest
15 голосов
/ 10 октября 2009

Хранение номера телефона в каком-то каноническом формате имеет несколько преимуществ с точки зрения программистов , но это может смутить пользователя , если вдруг его введенные номера будут выглядеть много разные.

Какой путь?

Ответы [ 12 ]

21 голосов
/ 10 октября 2009

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

Вот как я это делаю.

7 голосов
/ 06 января 2012

Надеюсь, это более практичный и прикладной ответ на старый вопрос.

Взгляните на https://github.com/googlei18n/libphonenumber.

Как упоминалось в @Gumbo, я бы сохранил номер телефона как E.164 , который вышеупомянутая библиотека проанализирует для вас. Может использоваться на нескольких языках программирования.

Для хранения БД вы могли бы фактически использовать E.164 в качестве Base64 (поскольку это, по иронии судьбы, является действительным base64), и декодировать Base64 как байты. Я полагаю, что число байтов в такой строке будет соответствовать стандарту long. Лично я бы просто сохранил E.164 как строку в базе данных.

Конечно, вам, вероятно, следует также сохранить то, что пользователь ввел первоначально перед анализом, но я настоятельно рекомендую вам ввести какой-то канонический номер, например E.164, для будущей интеграции с другими системами.

6 голосов
/ 16 октября 2009

Разделение обязанностей - содержание и рендеринг

Сохранение номера в каноническом формате и маски формата отображения.

Доходы:

  • Канонический формат для последовательности, качества и простоты анализа
  • Формат сохранен с точки зрения конечного пользователя
  • Формат, который можно использовать повторно для отображения других телефонных номеров предпочитаемым конечным пользователем способом
  • Маски других форматов могут использоваться для отображения канонического номера для других пользователей, которым необходимо увидеть номер телефона

Боль:

  • Разбор номера телефона в каноническом формате
  • Разбор маски формата отображения (не слишком болезненный в сочетании с вышеуказанным маркером)
  • Сохранение формата отображения в качестве предпочтения конечного пользователя
6 голосов
/ 11 октября 2009

Какая у вас база пользователей?

Если они будут ограничены географически (т. Е. Только для США), и вы собираетесь строго проверять числа, то отформатируйте число для них канонически - т. Е. Удалите любое форматирование, которое они использовали (например, периоды между числа ...) и вставьте тире (не пропустите проверку, если они не придерживаются вашего форматирования ... это просто значит). Я бы также сохранил эту очищенную версию в БД, а не в разобранном виде; это упрощает вашу жизнь при создании пользовательских отчетов и т. д.

Если у вас могут быть пользователи / номера со всего мира, лучше сохранить форматирование, которое они использовали. Также не забывайте, что иногда жители США в настоящее время путешествуют и используют иностранные номера: не блокируйте их непреднамеренно.

В любом случае: убедитесь, что вы НЕ определяете столбец как числовой, или делаете его слишком маленьким. Международные номера с форматированием могут быть длиной более 16 символов.

5 голосов
/ 12 октября 2009

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

5 голосов
/ 10 октября 2009

Великобритания - это особый случай, так как у нас есть коды STD (области) переменной длины и сам номер абонента переменной длины. Чем длиннее код STD, тем короче номер. Германия и некоторые другие страны также имеют аналогичную систему.

Числа в основном состоят из 10 цифр после префикса магистрали (междугородная связь), но в нескольких десятках областей также есть 9-значные числа.

  • 020 2345 5678 (Лондон) также Кардифф, Саутгемптон, Портсмут, Ковентри и Северная Ирландия
  • 0115 234 4567 (Ноттингем) также Шеффилд, Бристоль, Лестер, Рединг и Лидс
  • 0141 345 5678 (Глазго), также Бирмингем, Эдинбург, Тайнсайд, Манчестер и Ливерпуль
  • 01332 234 456 (Дерби) большинство других областей (около 580 областей) также используют этот формат
  • 01750 45678 (Селкирк) и около 40 областей имеют несколько чисел, которые короче цифры
  • 017687 45678 (Кесвик), а также Лангхольм, Хорнби, Хоксхед, Грандж-над-Сэндс, Седберг, Уигтон, Ротон Хед, Брэмптон, Эпплби, Пули Бридж и Госфорт.
  • 016977 2345 (Brampton) Единственное место, где используется формат «5 + 4».
  • 07812 123 456 (мобильные номера)

Помните, что номера 0800 могут быть разной длины, например, 0800 567 1234 или 0800 234 456. Старые цифры 0500 также на цифру короче, например, 0500 456 456.

Кроме того, некоторые люди любят группировать свои номера 234 234, в то время как другие используют 23 23 23 (в зависимости от фактических цифр).

Существуют аргументы для сохранения введенного и сохранения в единой форме:

Если вы сохраняете число как последовательность чисел, вы можете вывести его любым удобным для вас способом, либо с учетом предпочтений пользователя или их локали, и разделив число в соответствии с «правилами» (что бы они ни быть).

Если вы сохраняете как введено, то вы всегда будете отображать его так, как ожидает пользователь, но вам придется вычеркнуть нечисловые значения перед его использованием, что, если это часто может быть дорого.

4 голосов
/ 10 октября 2009

Основная сложность при канонизации телефонных номеров заключается в определении правильного канонического формата. Разные страны имеют разные способы группировки чисел - и внутри страны разные числа могут быть сгруппированы по-разному.

Раньше (когда-то десять или более лет назад) это был тот случай, когда в Великобритании вы имели 01-234-2345, 021-234-1234, 0334-234234, даже 092324-213; сейчас в Великобритании все по-другому - обычно больше цифр, и я больше не уверен насчет группировок (отсутствие делает ваши знания менее актуальными).

Работать с префиксами страны и указывать внутренний префикс набора номера - это весело: +44 (0) 1394-726629 - номер в Великобритании, код страны 44; набирая из-за пределов Великобритании, сбросьте 0; при наборе номера внутри Великобритании не включайте международный префикс, но включайте 0. Обратите внимание, что форма с (0) на самом деле недействительна, если вы следуете стандарту E.123.

Это похоже на проблему канонизации почтовых адресов - не так сложно, но все же плохо.

Кроме того, как отмечалось в моем комментарии к ответу HeavyWave, принуждать людей вводить номер телефона в виде цифровой строки без знаков препинания является мерзостью. Хорошо хранить это таким образом; просто представьте данные в удобочитаемом формате. Там слишком много ленивых веб-форм программирования.

1 голос
/ 27 сентября 2011

Позвольте пользователю ввести любой формат, который ему удобен, затем подтвердите его и сохраните в базе данных в согласованном формате - предпочтительно с включенным кодом страны.

При отображении номера отобразите его в правильном формате для этого диапазона номеров, с правильным интервалом, а для номеров национального формата добавьте скобки вокруг кода города, если это необходимо.

При отображении в качестве международного номера, будьте особенно осторожны, чтобы не включать какой-либо международный код доступа, так как он варьируется от страны к стране, например, показ французского номера 011 33 55 66 77 88 (набранный из США и Канады) бесполезен для британских читателей, потому что они наберут 00 33 55 66 77 88; всегда используйте формат +33 55 66 77 88.

Также в международном формате никогда не включайте префикс транка (0). Международный формат должен включать только цифры, набранные из-за рубежа.

1 голос
/ 16 октября 2009

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

0 голосов
/ 27 сентября 2011

Полезные ресурсы:

Список кодов Великобритании: http://www.telephonenumbers.co.uk/Telephone-Area-Codes-UK/i=2 (от июля 2011 г.).

Список длин номеров / числовых форматов для Великобритании (включает номера 01 и 02): http://www.aa -asterisk.org.uk / index.php / 01_numbers

Распределение в «смешанных» областях: http://www.aa -asterisk.org.uk / index.php / Mixed_areas

Распределения в областях "ELNS": http://www.aa -asterisk.org.uk / index.php / ELNS_areas

Список префиксов Великобритании с информацией о форматировании: http://www.aa -asterisk.org.uk / index.php / Sabc.txt

Форматирование британских номеров, безусловно, намного сложнее, чем (01234) 567890, (0141) 234 5678 и (020) 3456 7890.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...