Ответ 1
См. https://github.com/rmaddy/RMPhoneFormat для конкретного решения iOS.
Я просмотрел NSFormatter
, NSNumberFormatter
и другие классы форматирования, но не могу найти сборку в решении. Мне нужно отформатировать номера телефонов в зависимости от кода страны.
Например, для US я получаю строку, такую как +16313938888
, которую мне нужно форматировать, чтобы выглядеть как +1(631)393-8888
. Проблема в том, что мне нужно сделать это для всех форматов. Нидерланды, я получаю строку +31641234567
, которая будет +31(6)41 23 45 67
(что-то вроде этого).
Hardcoding для более чем 200 стран слишком утомительно, и я действительно не знаю всех правил формата. Есть ли что-то в документах, которые я пропускаю, или кто-нибудь знает о классе с открытым исходным кодом, который управляет этим?
См. https://github.com/rmaddy/RMPhoneFormat для конкретного решения iOS.
Попробуйте это решение Google - https://github.com/me2day/libPhoneNumber-iOS У них есть порты для С++, Java, Objective-C и других.
К сожалению, у iOS нет публичных API для этого. Вы можете попытаться интегрировать libphonenumber, что является полной реализацией для синтаксического анализа и форматирования международных телефонных номеров. Он имеет версию на С++, поэтому теоретически вы можете сшивать с ней.
Вы определенно не хотите жестко кодировать все форматы разных стран. Обычно в стране имеется 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.
Вы можете попробовать следующее:
let phoneNumber : CNPhoneNumber
let digits = phoneNumber.performSelector("digits").takeRetainedValue() as! String
Он дает вам строку, без форматирования, с номером телефона. Однако, если номер сохранен с международным префиксом, вы также получите его в приведенной строке.