NSNumberFormatter для форматирования телефонных номеров США - PullRequest
8 голосов
/ 20 марта 2009

Я пытаюсь преобразовать введенную пользователем строку чисел в сексуальную строку, такую ​​как Phone.app на iPhone. Вот код, который я использую, который не работает (никакой специальный формат не выходит), и после определенного количества цифр он просто начинает добавлять «0» в конец строки.

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterNoStyle];
[formatter setPositiveFormat:@"+# (###) ###-###"];
[formatter setLenient:YES];
NSString *strDigits = [self stringByReplacingOccurrencesOfRegex:@"[^0-9+]" withString:@""];
return [formatter stringFromNumber:[NSNumber numberWithDouble:[strDigits doubleValue]]];

Ответы [ 5 ]

11 голосов
/ 05 июня 2009

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

Общая проблема здесь заключается в том, что iPhone SDK не предоставляет метод для форматирования телефонных номеров в зависимости от локали.

Я поднял ошибки в Apple по следующим причинам (две из них были дубликатами известных проблем, поэтому я включил в них оригинальную ошибку # Apple):

#6933244 - Need iPhone SDK interface to format text as locale dependent phone number
#5847381 - UIControl does not support a setFormatter method
#6024985 - Overridden UITextField drawTextInRect method is never called

В идеальном мире Apple предоставила бы NSPhoneNumberFormatter, и вы бы назвали setFormatter на своем UIControl, чтобы он отображал text довольно симпатичным способом. К сожалению, этого не существует на iPhone.

9 голосов
/ 22 января 2010

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

+ 1 (###) ### - ####
1 (###) ### - ####
011 $
### - ####
(###) ### - ####

Мне пришлось сделать что-то подобное, и я поделился результатами, которые получил здесь: http://the -lost-beauty.blogspot.com / 2010/01 / локаль-чувствительный-телефон-number.html

2 голосов
/ 12 сентября 2012

Apple говорит, что вы можете реализовать свой собственный форматер, если функциональности существующих форматеров недостаточно:

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

Инструкции по созданию собственного пользовательского форматера см. В разделе «Создание пользовательского форматера».

См. раздел в Руководстве по форматированию данных

2 голосов
/ 20 марта 2009

Ну, телефонный номер должен быть 10 символов (11 с первым 1), поэтому вы должны начать с изменения этого:

[formatter setPositiveFormat:@"+# (###) ###-####"];

И, говоря о ведущей 1, вам тоже нужно это проверить.

0 голосов
/ 14 февраля 2019

Одна вещь, которая здесь никогда не упоминается, это то, что NSNumberFormatter всегда будет преобразовывать значение в, ну, ну, в NSNumber. Если вам нужен более обобщенный NSFormatter, создайте подкласс NSFormatter и реализуйте методы, упомянутые в разделе Создание пользовательского форматера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...