Как проверить ввод в UITextField (то есть, числовой ввод) - PullRequest
9 голосов
/ 16 сентября 2009

Я довольно новичок в разработке для iPhone, и у меня есть простой вопрос, который я не могу понять.Как я могу убедиться, что пользователь вводит число и десятичное число в текстовое поле?

Я пробовал много разных вещей, но закрытие, которое я могу получить, допускает только числовые строки вида: 5.34 или 23.89.Мне нужно, чтобы разрешить такие номера, как;0,50 или 432,30, просто что-то с нулем в качестве последнего входного значения.Я попытался проверить ввод строки, преобразовав его в число с плавающей точкой, а затем обратно в строку, но получил вышеупомянутые результаты.

ЛЮБАЯ справка была бы отличной (то же самое с примером кода!) СПАСИБО!

Ответы [ 3 ]

13 голосов
/ 20 февраля 2012

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

Следующая реализация метода делегата 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

1 голос
/ 19 февраля 2010

Вы можете преобразовать содержимое вашего текстового поля в float и отформатировать его, используя код ниже:

float myFloat = [myTextField floatValue];
NSString *formatString = [NSString stringWithFormat:@"%%1.%if", 2]; //2 decimals after point
NSString *resultString = [NSString stringWithFormat:formatString, myFloat];

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

Если пользователь введет «abc12.4», результатом будет «0». Так что было бы лучше, если вы используете метод UITextFieldDelegate:

textField:shouldChangeCharactersInRange:replacementString:

, чтобы проверить последний нажатый пользователем ключ. Вы можете просто сравнить его, чтобы узнать, является ли оно числовым значением или точкой / запятой.

1 голос
/ 16 февраля 2010

Вопрос, который Дейв Делонг пытался опубликовать, - 1320295 и выглядит очень актуально. Похоже, это старый вопрос, вы, вероятно, нашли свое решение. Было бы неплохо, если бы вы поделились всем этим =)

...