2013-08-08 3 views
0

Я пытаюсь преобразовать пользовательский ввод числа из UITextView (а не UITextField, по причинам, которые занимают слишком много времени) в число. Хотя это не создавало проблем, когда пользователь вводит данные через десятичную клавиатуру на iPhone, используя клавиатуру bluetooth (или используя клавиатуру в симуляторе, пользователь может вводить нечисловые символы или может нажать клавишу возврата. NSNumberFormatter, чтобы вернуть nil, что, конечно же, мне не подходит.NSNumberFormatter возвращает nil, если неожиданные символы в строке

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

Вот мой код:

static NSNumberFormatter *numberFormatter; 
if (numberFormatter==nil) { 
     numberFormatter=[[NSNumberFormatter alloc] init]; 
     [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
     [numberFormatter setLenient:YES]; 
} 
self.value = [numberFormatter numberFromString:self.valueTextView.text]; 

Как я уже сказал, если пользователь вводит 42, или 42.5, это работает нормально, но если она вводит 42.5<Return> (что может быть сделано только с клавиатуры), то self.value - nil. Примечание: Я добавил режим setLenient, чтобы попытаться справиться с проблемой, но безрезультатно.

Я проверил другие ответы на переполнение стека (количество людей задавали подобные вопросы), но ответы, которые я нашел только подтвердить, что да, NSNumberFormatter только разобрать, не проверить, и если он не может разобрать, что будет return nil. Это не решает проблему. Как другие справляются с этим? Это должна быть общая проблема ...

+0

Что вы хотите, чтобы оно было возвращено, если строка не является числовой? –

ответ

1

Вы должны реализовать метод делегирования textView:shouldChangeTextInRange:replacementText:. В своей реализации вы должны создать текст, который будет существовать, если вы разрешите завершить редактирование и попытаться получить номер из этого текста с помощью вашего форматирования. Если вы получите номер, разрешите редактирование. Если нет, откажитесь от редактирования.