Сохранение номера телефона в каком-то каноническом формате имеет несколько преимуществ с точки зрения программистов, но это может смутить пользователя, если вдруг его введенные числа выглядят много иначе.
Как поступить?
Сохранение номера телефона в каком-то каноническом формате имеет несколько преимуществ с точки зрения программистов, но это может смутить пользователя, если вдруг его введенные числа выглядят много иначе.
Как поступить?
Я бы сохранил исходный введенный беспорядок, но также вставлял бы очищенную форму в базу данных. Который только сохранял числа с меньшим количеством знаков препинания и пробелов. Использование очищенной формы позволит легко искать, не беспокоясь о различных возможных введенных стилях.
Сохраните его, но вы предпочитаете, но перед тем, как показать его пользователю, переведите его в удобочитаемый формат. И, пожалуйста, не заставляйте своих пользователей вводить номера телефонов в выбранном вами формате, пусть они просто набирают его, как им нравится.
Как я это делаю.
Надеюсь, это более практичный и прикладной ответ на старый вопрос.
Посмотрите https://github.com/googlei18n/libphonenumber.
Как указано в @Gumbo, я бы сохранил номер телефона как E.164, который вы просматриваете выше. Он может использоваться с нескольких разных языков программирования.
Для хранилища БД вы действительно можете использовать E.164 в качестве Base64 (поскольку он по иронии судьбы является допустимым base64) и декодировать Base64 как байты. Я считаю, что количество байтов из такой строки будет соответствовать стандарту long
. Лично я бы просто сохранил E.164 как строку в базе данных.
Конечно, вы, вероятно, также должны хранить то, что пользователь вводил первоначально, перед разбором, но я настоятельно рекомендую вам ввести каноническое число, например E.164, для дальнейшей интеграции с другими системами.
Какая ваша пользовательская база?
Если они будут ограничены географически (т.е. только для США), и вы будете строго проверять номера, затем отформатируйте их число канонически, т.е. разделите любое форматирование, которое они использовали (например, периоды между номера...) и вставлять тире (не пропустите проверку, если они не придерживаются вашего форматирования... это просто означает). Я бы сохранил эту очищенную версию в БД, а не урезанный номер; это делает вашу жизнь немного легче при создании пользовательских отчетов и т.д.
Если у вас могут быть пользователи/номера со всего мира, лучше сохранить форматирование, которое они использовали. Также не забывайте, что иногда жители США в настоящее время путешествуют и используют иностранный номер: не блокируйте их непреднамеренно.
В любом случае: убедитесь, что вы НЕ определяете столбец как числовые или делаете его слишком маленьким. Международные номера с форматированием могут быть длиннее 16 символов.
Великобритания - это особый случай, поскольку мы имеем коды STD (площадь) переменной длины и сам абонентский номер переменной длины. Чем длиннее код STD, тем короче это число. Германия и некоторые другие страны также имеют аналогичную систему.
Числа в основном составляют 10 цифр после префикса 0 туловища (дальнего), но несколько десятков областей также содержат 9 цифр.
Остерегайтесь того, что номера 0800 могут быть разных длин, например. 0800 567 1234 или 0800 234 456. Старые номера 0500 также являются цифрой короче, например. 0500 456 456.
Кроме того, некоторым людям нравится группировать свои номера 234 234, в то время как другие используют 23 23 23 (в зависимости от фактических цифр).
Есть аргументы для хранения, как введенные и хранящиеся в одной форме:
Если вы храните номер как просто последовательность чисел, вы можете его выводить любым способом, либо принимая во внимание пользовательские настройки, либо их локаль и разделяя число в соответствии с "правилами" (что когда-либо они могут быть).
Если вы сохранили, как указано, вы всегда будете отображать его, как ожидает пользователь, но перед его использованием вам нужно будет вырезать не числовые значения, что часто бывает дорого.
Сохраните номер в каноническом формате и маске формата отображения.
Прибыль:
Pains:
Основной трудностью в канонизации номеров телефонов является определение правильного канонического формата. В разных странах разные способы группировки чисел - и внутри страны разные группы могут быть сгруппированы по-разному.
Он использовал (раз в десять или более лет назад) тот случай, что в Великобритании у вас были 01-234-2345, 021-234-1234, 0334-234234, даже 092324-213; сейчас все по-другому в Великобритании - в целом больше цифр, и я больше не уверен в группировках (отсутствие делает одно знание менее текущим).
Работа с префиксами страны и указанием внутреннего префикса набора номера - это весело: +44 (0) 1394-726629 - номер в Великобритании, код страны 44; набрав из-за пределов Великобритании, сбросьте 0; набрав внутри Великобритании, не включите международный префикс, но включите 0. Обратите внимание, что форма с (0) в ней фактически недействительна, если вы следуете стандарту E.123.
Это похоже на проблему канонизации почтовых адресов - не так сложно, но все равно плохо.
Кроме того, как отмечалось в моем комментарии к запросу HeavyWave, принуждение людей вводить номер телефона в виде строки цифр без пунктуации является неприятным. Это прекрасно, чтобы сохранить его таким образом; просто представить данные в формате, удобочитаемом человеком. Там слишком много ленивого программирования веб-форм.
Мой инстинкт кишки должен канонизировать в соответствии с местными стандартами сущности, а затем отображать в модуле удобства использования канонического представления.
Позволяет пользователю вводить любой удобный для них формат, а затем проверять его и хранить в базе данных в согласованном формате - желательно с включенным кодом страны.
При отображении номера отобразите его в правильном формате для этого диапазона номеров с правильным интервалом, а для номеров национального формата добавьте круглые скобки вокруг кода области, если это необходимо.
Если вы показываете как международный номер, будьте особенно осторожны, чтобы не включать какой-либо международный код доступа, поскольку он зависит от страны, например. показывая французский номер как 011 33 55 66 77 88 (как набирается из США и Канады) бесполезно для читателей из Великобритании, потому что они набирают 00 33 55 66 77 88; всегда используйте формат +33 55 66 77 88.
Также с международным форматом никогда не включайте префикс соединительной линии (0). Международный формат должен включать только цифры, которые набираются из-за границы.
Подтвердить ввод, но разрешить широкий спектр форматов. Сохраните его, когда пользователь набрал его, а затем при необходимости измените формат вывода.
Скажем, пользователь ввел свой номер во время регистрации в общедоступную записную книжку. Таким образом, я бы отобразил его, как пользователь, набрал его в текстовом поле на странице "изменить мой профиль", например. Но я бы показал, что он переформатирован в стандартный формат в списке общедоступных телефонных книг.
Полезные ресурсы:
Список кодов Великобритании: 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.
Мне обычно нравится записывать номер, разделенный, а затем формат для отображения. Поскольку я обычно не создаю приложение для использования во всем мире, мне обычно не приходится беспокоиться о формате. Но в случае приложения для использования по всему миру, я бы, вероятно, создал модуль форматирования, который форматирует в соответствии с локалью номера телефона.