У меня было похожее требование, и решение в итоге оказалось довольно тривиальным. К сожалению, многие вопросы и ответы, связанные с этим вопросом, касаются проверки или форматирования числовых значений, а не управления тем, что может ввести пользователь.
Следующая реализация метода делегата shouldChangeCharactersInRange является моим решением. Как всегда, RegularExpressions качаются в этой ситуации. RegExLib.com является отличным источником полезных RegEx's. Я не гуру RegEx и всегда немного стараюсь собрать их вместе, поэтому любые предложения по его улучшению приветствуются.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if (textField == self.quantityTextField)
{
NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
NSString *expression = @"^([0-9]+)?(\\.([0-9]{1,2})?)?$";
NSError *error = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression
options:NSRegularExpressionCaseInsensitive
error:&error];
NSUInteger numberOfMatches = [regex numberOfMatchesInString:newString
options:0
range:NSMakeRange(0, [newString length])];
if (numberOfMatches == 0)
return NO;
}
return YES;
}
Приведенный выше код позволяет пользователю вводить следующие значения: 1, 1.1, 1.11, .1, .11