NSNumberFormatter для форматирования номеров телефонов в США

Я пытаюсь преобразовать строку чисел, введенную пользователем, в сексуальную строку, такую ​​как 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]]];

Ответ 1

Я думаю, ваша проблема в том, что 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.

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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