API формата номера телефона Java

У меня есть firebase database с миллионами телефонных номеров со свободным для всех форматированием. Т.е. пользовательский интерфейс не применяет никаких ограничений, и пользователи набирают все, что захотят.

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

Например, номер телефона в системе может выглядеть следующим образом:

(555) 478-1123 555-478-1123 555.478.1123 5554781123 

Учитывая страну США, API будет производить значение «+1 (555) 478-1123» для всех этих. Точный формат не имеет значения, если он последователен.

В системе также есть номера без кодов областей, таких как «478-1123». В этом случае я ожидал бы NoAreaCodeException или что-то подобное.

Могут также быть такие данные, как «abc», которые также должны генерировать исключения.

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

Кто-нибудь видел такой API?

Вы можете написать свой собственный (для формата телефона США #):

  • Сбросьте любые нечисловые символы из строки
  • Убедитесь, что оставшаяся строка имеет длину десять символов
  • Поместите круглые скобки вокруг первых трех символов и тире между шестым и седьмым символами.
  • Подготовьте «+1» к строке

Обновить:

Недавно Google выпустил libphonenumber для синтаксического анализа, форматирования, хранения и проверки международных телефонных номеров.

Вы можете попробовать эту библиотеку форматирования номера телефона Java https://github.com/googlei18n/libphonenumber

Он содержит данные для сотен стран и форматов.

Простой синтаксический анализатор регулярных выражений

 /** * @param pPhoneNumber * @return true if the phone number is correct */ private boolean isPhoneNumberCorrect(String pPhoneNumber) { Pattern pattern = Pattern .compile("((\\+[1-9]{3,4}|0[1-9]{4}|00[1-9]{3})\\-?)?\\d{8,20}"); Matcher matcher = pattern.matcher(pPhoneNumber); if (matcher.matches()) return true; return false; } 

Формат

Я сделал это согласно моим потребностям, и он принимает цифры:

  1. CountryCode-Number
  2. Число

Коды стран:

Они могут иметь: + или один или два нуля. Тогда за ним может следовать a - .

Принимает:

  • +456
  • 00456
  • +1234
  • 01234

Все вышеизложенное может или не может сопровождаться a -

Rejects:

  • 0456
    • должен быть:
      • 00456 или +456 или 04444

Число

Простое число с 8-20 цифрами.

Принимает:

  • 00456-12345678
  • +457-12345678
  • +45712345678
  • 0045712345678
  • 99999999

Расширить?

Не стесняйтесь, поэтому вы можете включить поддержку . или ‘(‘ separators. Просто убедитесь, что вы их избегаете, например for ( use \( .

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

Последние версии http://code.google.com/p/libphonenumber/ добавили метаданные для многих новых стран и добавили намного больше деталей для некоторых из ранее перечисленных стран.

Текущая версия исходного кода – r74, а файл .jar – в версии 2.6. Предыдущие файлы .jar были скомпилированы для Java 1.6, но с версии libphonenumber версии 2.5.1 они теперь скомпилированы для Java 1.5 и выше.

Не забывайте, что есть прямой порт кода для JavaScript. Его можно найти в дереве исходного кода по адресу http://code.google.com/p/libphonenumber/source/browse/#svn%2Ftrunk%2Fjavascript

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

Не изобретайте колесо повторно; используйте API, например http://libphonenumber.googlecode.com/. Этот API также дает вам хорошее форматирование. Пример :

 String number = "(555) 478-1123"; PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance(); try { Phonenumber.PhoneNumber phoneNumber = phoneNumberUtil.parse(number, Locale.US.getCountry()); } catch (NumberParseException e) { // error handling } 

Вы даже можете использовать объект phoneNumber, чтобы красиво отформатировать его действительным номером телефона, прежде чем сохранять его в БД или что-то еще.

Для французского номера, который выглядит как «01 44 55 66 77», мы можем использовать следующую логику.

 DecimalFormatSymbols dfs = new DecimalFormatSymbols(); dfs.setGroupingSeparator(' '); // sometimes '.' is used DecimalFormat decfmt = new DecimalFormat("0,0", dfs); // enable grouping decfmt.setMinimumIntegerDigits(10); // we always have 10 digits decfmt.setGroupingSize(2); // necessary in order to group digits by 2 orders System.out.println(decfmt.format(144556677)); // outputs "01 44 55 66 77" 

Как только это можно сделать, с помощью API номера телефона Google, о котором упоминалось выше, мы можем легко проанализировать эти последовательности и переформатировать их в другие формы, такие как «+33 1 44 55 66 77», как показано ниже:

 Iterable numbers = PhoneNumberUtil.getInstance().findNumbers(textWithPhoneNums, "FR"); for(Iterator iterator = numbers.iterator(); iterator.hasNext(); ){ PhoneNumberMatch pnm = iterator.next(); PhoneNumber number = pnm.number(); System.out.println(PhoneNumberUtil.getInstance().formatOutOfCountryCallingNumber(number, null)); } 

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

Я бы начал искать подробную информацию здесь , здесь и здесь – если есть API для ее обработки (на Java или иначе), они также могут быть связаны с ними.

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

Лучшее, что я нашел, было javax.telephony , которое можно найти здесь: http://java.sun.com/products/javaphone/

У него class адресов, но, к сожалению, этот class не решил вашу проблему: (Ну, может быть, вы можете найти решение, углубляясь в него.

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

Мои собственные потребности были очень простыми. Мне просто нужно было сделать 7 или 10-значный номер и поместить разделители (тире, период, несколько строк символов и т. Д.) Между кодом города, обменом и номером обмена. Любое значение, переданное в метод, который не является числом или не является длиной 7 или 10, просто возвращается. Нулевое значение возвращает пустую строку, а нулевое значение для разделителя рассматривается как пустая строка. Мой код:

 import java.util.regex.Matcher; import java.util.regex.Pattern; // ... private String formatPhoneNumber(String phnumber, String separator) { phnumber = (phnumber == null) ? "" : phnumber; if ((phnumber.length() != 7) && (phnumber.length() != 10)) { return phnumber; } // If we get here, 'phnumber' is for sure either 7 or 10 chars long separator = (separator == null) ? "" : separator; Pattern p = Pattern.compile("([0-9]*)"); Matcher m = p.matcher(phnumber); if (m.matches()) { if (phnumber.length() == 7) { return phnumber.substring(0, 3) + separator + phnumber.substring(4); } else { return phnumber.substring(0, 3) + separator + phnumber.substring(3, 6) + separator + phnumber.substring(6); } // If we get here, it means 1 or more of the chars in 'phnumber' // is not a digit and so 'phnumber' is returned just as passed in. return phnumber; } 
  • Ограничить десятичные места в Android EditText
  • Почему 128 == 128 возвращает false, но 127 == 127 возвращает true при преобразовании в обертки Integer?
  • Объявление float, почему default type double?
  • Использование акселерометра, гироскопа и компаса для расчета движения устройства в 3D-мире
  • android.content.res.Resources $ NotFoundException: Идентификатор ресурса строки # 0x0
  • Как сделать мою прикладную систему
  • Внутренний class может получить доступ, но не обновлять значения - AsyncTask
  • Как я могу перечислять все classы в пакете и добавлять их в список?
  • Создание видеофайла с изображений с помощью ffmpeg
  • Android написать в папку sd card
  • Как конвертировать минуты в часы и минуты (чч: мм) в java
  • Давайте будем гением компьютера.