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

Лучше ли хранить номера телефонов в каком-то каноническом формате или "как указано"?

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

Как поступить?

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

Посмотрите https://github.com/googlei18n/libphonenumber.

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

Числа в основном составляют 10 цифр после префикса 0 туловища (дальнего), но несколько десятков областей также содержат 9 цифр.

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

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

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

Есть аргументы для хранения, как введенные и хранящиеся в одной форме:

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

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

Ответ 6

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

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

Прибыль:

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

Pains:

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

Ответ 7

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

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

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

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

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

Ответ 8

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

Ответ 9

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

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

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

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

Ответ 10

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

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

Ответ 11

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

Список кодов Великобритании: 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.

Ответ 12

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