代码之家  ›  专栏  ›  技术社区  ›  Daddy

iphone/ipad:在只针对整数的文本框中检查无效字符

  •  1
  • Daddy  · 技术社区  · 16 年前

    我注意到iPhone操作系统在被要求选择整数值时相当不错。具体来说,如果你使用

    NSString *stringName = @"6(";
    int number = [stringName intValue];
    

    iPhone操作系统将选出6并将变量数转换为6。然而,在更复杂的错误类型中,这也使得int变量6:

    NSString *stringName = @"6(5";
    int number = [stringName intValue];
    

    iPhone操作系统错过了另一个数字,当用户试图输入65时,操作系统只能从中得到6。我需要一个解决方案来检查字符串中的无效字符,如果文本框中有除无符号整数以外的任何字符,则返回no。这是针对iPad的,目前没有像iPhone那样的数字键盘,我只使用标准的123键盘。

    我在想,我需要使用nsrange并以某种方式循环遍历文本框中的整个字符串,然后检查迭代中的当前字符是否是数字。我迷路了。我可以考虑用零来测试它,但是零是一个有效的整数。

    有人能帮忙吗?

    4 回复  |  直到 16 年前
        1
  •  3
  •   Noah Witherspoon    16 年前

    实施 UITextFieldDelegate 方法,并使用 NSString 方法 -rangeOfCharacterFromSet: ,像这样:

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)newString
    {
        // create a character set containing everything except the decimal digits
        // (you might want to cache this, as inverting the set probably isn't fast)
        NSCharacterSet *nonNumericCharacters = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
        // and check whether there's a character in the string that's not in that set
        if([newString rangeOfCharacterFromSet:nonNumericCharacters].location != NSNotFound)
            return NO;
        return YES;
    }
    
        2
  •  1
  •   David Gelhar    16 年前

    你可能想用 NSScanner

    使用nsscanner,您可以 -scanInt: 然后检查 -isAtEnd

        3
  •  0
  •   NSResponder    16 年前

    我只要 UITextField 的委托拒绝任何插入非数字字符的尝试。见 -textField:shouldChangeCharactersInRange:replacementString:

        4
  •  0
  •   Madhup Singh Yadav    16 年前
        - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
        {
    
                if([string isEqualToString:@"\b"] || [string isEqualToString:@"0"] ||  [string isEqualToString:@"1"] ||[string isEqualToString:@"2"] || [string isEqualToString:@"3"] || [string isEqualToString:@"4"] || [string isEqualToString:@"5"] || [string isEqualToString:@"6"] || [string isEqualToString:@"7"] || [string isEqualToString:@"8"] || [string isEqualToString:@"9"] || [string isEqualToString:@"."])
                {
                    return YES;
                }
               else{
                    return NO;
               }
    }
    

    希望这有帮助。

    谢谢,

    马杜普