2010-04-27 2 views
16

У меня есть UITextField в моем IB, и я хочу проверить, введен ли пользователь только числа (без char) и получить целочисленное значение.Iphone UITextField only integer

Я получаю целое значение UITextField как это: (.,;)

int integer = [myUITexrtField.text intValue]; 

Когда я помещал характер его вернуть мне 0, и я не знаю, как определить, что это не только номера.

Как я могу это сделать?

+1

Изменить тип клавиатуры Числовой тип .. – Swapnil

ответ

4

http://rosettacode.org/wiki/Determine_if_a_string_is_numeric#Objective-C

Или вы могли бы гарантировать, что только цифровая клавиатура появляется, когда фокус идет на поле

+14

Опираясь на числовую клавиатуру не безопасно, так как пользователь может вставлять строковые данные в поле, а не даже с помощью клавиатуры. – Shoerob

+1

Цифровая клавиатура не имеет ключа возврата ... –

+0

последний ответ больше accourate –

1

Вы можете также использовать метод UITextFieldDelegate

textField:shouldChangeCharactersInRange:replacementString:

жить проверить, что каждый раз, когда пользователь нажимает клавишу, это простая цифра, так что он/она знает, что в поле вводится только значение int.

+0

Троллинг для хитов jeeva? –

17

Обязательно установите ваш текстовое поле делегату

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

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 

    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; 
    [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; 

    NSNumber* candidateNumber; 

    NSString* candidateString = [textField.text stringByReplacingCharactersInRange:range withString:string]; 

    range = NSMakeRange(0, [candidateString length]); 

    [numberFormatter getObjectValue:&candidateNumber forString:candidateString range:&range error:nil]; 

    if (([candidateString length] > 0) && (candidateNumber == nil || range.length < [candidateString length])) { 

     return NO; 
    } 
    else 
    { 
     return YES; 
    } 
} 
+1

Это не работает, если первый введенный символ - это буква. Если сначала вводится число, тогда набирается буква, это работает. – GarethPrice

49

Реализация shouldChangeCharactersInRange метод, как показано ниже, не позволяют пользовательский ввод нечисловых персонажи.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    NSCharacterSet *nonNumberSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet]; 
    return ([string stringByTrimmingCharactersInSet:nonNumberSet].length > 0) || [string isEqualToString:@""]; 
} 

Это возвращает ДА, если строка является числовой, НИ В противном случае. [string isEqualToString @ ""] заключается в том, чтобы сохранить ключ возврата для удаления.

Мне нравится этот подход, потому что он чист.

+9

Чтобы включить delete: return ([string stringByTrimmingCharactersInSet: nonNumberSet] .length> 0) || [string isEqualToString: @ ""]; – andershqst

+7

Проблема только в том, что пользователь вставляет строку, например. 1n1a, stringByTrimmingCharactersInSet: удаляется только с начала и конца строки. Сделайте что-то вроде: NSRegularExpression * numbersOnly = [NSRegularExpression regularExpressionWithPattern: @ "[0-9] +" options: NSRegularExpressionCaseInsensitive error: & error]; NSInteger numberOfMatches = [numbersOnly numberOfMatchesInString: параметры строки: диапазон 0: NSMakeRange (0, string.length)]; if (numberOfMatches! = 1 && string.length! = 0) { shouldChange = NO; } – mbogh

+0

Комментарий @mbogh должен быть ответом. – septerr

3

Чтобы разрешить только для ввода цифр:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    return [string isEqualToString:@""] || 
     ([string stringByTrimmingCharactersInSet: 
      [[NSCharacterSet decimalDigitCharacterSet] invertedSet]].length > 0); 
} 

Чтобы проверить целое число:

- (BOOL)isNumeric:(NSString *)input { 
    for (int i = 0; i < [input length]; i++) { 
     char c = [input characterAtIndex:i]; 
     // Allow a leading '-' for negative integers 
     if (!((c == '-' && i == 0) || (c >= '0' && c <= '9'))) { 
      return NO; 
     } 
    } 
    return YES; 
} 
9

Try это: Это остановит пользователя ввести любой символ затем число

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    NSCharacterSet *nonNumberSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet]; 

    if ([string rangeOfCharacterFromSet:nonNumberSet].location != NSNotFound) 
    { 
     return NO; 
    } 
    return YES; 
} 
+1

Ответ был предоставлен и принят 2 года назад. Пожалуйста, не отвечайте на такие старые вопросы, на которые уже был дан ответ, если у вас нет чего-то существенного для добавления. – mah

+0

Что ваш ответ добавляет к предыдущим? Почему это ценно, и вы думаете, что это должен быть ответ? Есть уже несколько высоких ответов на этот вопрос, почему вы разные? – Yaroslav

+1

Это было очень быстрое решение для реализации. не забудьте добавить делегат textField в файл .h – Chrizzz

1

Хотите разрешить отрицательный номер?

Разрабатывая ответ davsan, вот решение, которое поддерживает ввод отрицательный, а также положительные числа и запрещает что-либо еще.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    NSCharacterSet *nonNumberSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet]; 
    return ([string stringByTrimmingCharactersInSet:nonNumberSet].length > 0) || [string isEqualToString:@""] || ([textField.text isEqualToString:@""] && [string isEqualToString:@"-"]); 

    return YES; 
} 
0

Этот код также относится к локализации.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
    { 
     if([string isEqualToString:@""]) return YES; 
     NSCharacterSet *characterSet = nil; 
     characterSet = [NSCharacterSet decimalDigitCharacterSet]; 
     NSRange location = [string rangeOfCharacterFromSet:characterSet]; 
     return (location.location != NSNotFound); 

     if(characterSet == nil) return YES; 
     return YES; 

    } 
2

Ответа на этот вопрос @devsan.Если пасты пользователь что-нибудь с аа числа таких, как «1abc» ее код сломается

Это должно быть (возможность замены только если все символы являются цифрами):

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
NSCharacterSet *nonNumberSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet]; 
return ([string stringByTrimmingCharactersInSet:nonNumberSet].length == string.length) || [string isEqualToString:@""]; 
}