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

Форматирование локализованного номера телефона

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

Например, для US я получаю строку, такую ​​как +16313938888, которую мне нужно форматировать, чтобы выглядеть как +1(631)393-8888. Проблема в том, что мне нужно сделать это для всех форматов. Нидерланды, я получаю строку +31641234567, которая будет +31(6)41 23 45 67 (что-то вроде этого).

Hardcoding для более чем 200 стран слишком утомительно, и я действительно не знаю всех правил формата. Есть ли что-то в документах, которые я пропускаю, или кто-нибудь знает о классе с открытым исходным кодом, который управляет этим?

4b9b3361

Ответ 3

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

Ответ 4

Вы определенно не хотите жестко кодировать все форматы разных стран. Обычно в стране имеется 3-5 форматов. Вместо этого используйте базу данных формата (например, plist) и напишите код для форматирования номера на основе данного кода страны.

Хороший список свойств международного формата "UIPhoneFormats.plist" можно найти здесь: https://code.google.com/p/iphone-patch/source/browse/trunk/bgfix/UIKit.framework/PhoneFormats/UIPhoneFormats.plist?r=7

В этом списке "$" допускает любой символ, "#" должен быть числом, а "номера", "(", ") и" - "вставлены между цифрами. Нечисловые символы, введенные пользователем, указывают на нужный формат.

Я поделился своим номером с классом форматирования номера, вдохновленным работой Ахмеда Абделькадера, в https://github.com/lathamglobal/iOS-Phone-Number-Formatter. Это очень маленький, одноклассный формат номера международного телефона, который использует только что упомянутый plist.

Ответ 5

Вы можете попробовать следующее:

    let phoneNumber : CNPhoneNumber
    let digits = phoneNumber.performSelector("digits").takeRetainedValue() as! String

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