iPhone UITextField只能输入整数

16
我在IB中有一个UITextField,我想检查用户是否只输入了数字(没有字符),并获取整数值。
我这样获取UITextField的整数值:
int integer = [myUITexrtField.text intValue];

当我输入字符(, ; .)时,它返回0,我不知道如何检测它不仅仅是数字。

我该怎么做?


1
将键盘类型更改为数字类型。 - Swapnil
9个回答

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:@""];
}

如果字符串是数值类型,返回YES,否则返回NO。 [string isEqualToString:@“”] 用于支持回退键删除。

我喜欢这种方法,因为它很简洁。


9
为了实现删除功能:返回 ([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:string options:0 range:NSMakeRange(0, string.length)]; if (numberOfMatches != 1 && string.length != 0) { shouldChange = NO; } - mbogh
@mbogh的评论应该是答案。 - septerr
或者,您可以将第二行更改为“return [string stringByTrimmingCharactersInSet:numbers] .length == string.length;” - Jason

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

9
尝试这个:它将阻止用户输入除数字以外的任何字符。
- (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
两年前已经有人提供并接受了答案。请不要回答那些早已被解决的老问题,除非你有实质性的补充。 - mah
你的回答与之前的回答有何不同?为什么它很有价值,你认为应该成为一个答案?这个问题已经有几个高赞的答案了,为什么你的不同呢? - Yaroslav
1
这是一个非常快速的解决方案,容易实现。别忘了将textField代理添加到.h文件中。 - Christian Loncle

4

15
仅依赖于数字键盘并不安全,因为用户有可能会将字符串粘贴到字段中,而不是使用键盘输入。 - Shoerob
上一个答案更准确。 - endo.anaconda

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;
}

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:@""];
}

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;
}

1
您还可以使用 UITextFieldDelegate 方法
textField:shouldChangeCharactersInRange:replacementString:
实时检查每次用户按键时,它是一个简单的数字,以便他/她知道该字段仅输入 int 值。

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;

    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接