Ответ 1
http://rosettacode.org/wiki/Determine_if_a_string_is_numeric#Objective-C
Или вы можете убедиться, что появляется только цифровая клавиатура, когда фокус появляется в поле
У меня есть UITextField в моей IB, и я хочу проверить, введен ли пользователь только числа (no char) и получить целочисленное значение.
Я получаю целочисленное значение UITextField:
int integer = [myUITexrtField.text intValue];
Когда я помещаю символ (,;.), он возвращает мне 0, и я не знаю, как определить, что это не только числа.
Как я могу это сделать?
http://rosettacode.org/wiki/Determine_if_a_string_is_numeric#Objective-C
Или вы можете убедиться, что появляется только цифровая клавиатура, когда фокус появляется в поле
Реализация метода shouldChangeCharactersInRange, как показано ниже, не позволяет пользователю вводить нечисловые символы.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSCharacterSet *nonNumberSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
return ([string stringByTrimmingCharactersInSet:nonNumberSet].length > 0) || [string isEqualToString:@""];
}
Это возвращает YES, если строка является числовой, и нет. [string isEqualToString @""] заключается в том, чтобы поддерживать обратный пробел для удаления.
Мне нравится этот подход, потому что он чист.
Обязательно установите делегат текстового поля
Используйте следующую функцию, чтобы пользователь мог вводить только цифры:
- (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;
}
}
Попробуйте следующее: он запретит пользователю вводить любой символ, кроме цифр
- (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;
}
Чтобы разрешить только числовой ввод:
- (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;
}
Ответа на этот вопрос @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:@""];
}
Вы также можете использовать метод UITextFieldDelegate
TextField: shouldChangeCharactersInRange: replacementString:
чтобы проверить, что каждый раз, когда пользователь нажимает клавишу, это простая цифра, так что он/она знает, что в поле вводится только значение int.
Хотите разрешить отрицательные номера?
Разрабатывая ответ 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;
}
Этот код также работает с локализацией.
- (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;
}