我正在使用NSScanner将文本字段的值限制为仅数字,但是我想允许“-”

问题描述

我在自定义NSNumberFormatter中有一个NSScanner,它可以扫描非整数值,但我希望它跳过“-”(破折号)

- (BOOL)isPartialStringValid:(Nsstring *)partialString newEditingString:(Nsstring **)newString errorDescription:(Nsstring **)error {
    if ([partialString length] == 0) {
        return YES;
    }
    
    NSScanner *scanner = [NSScanner scannerWithString:partialString];
    
    if (!([scanner scanInt:0] && [scanner isAtEnd])) {
        return NO;
    }
    
    return YES;
}

我以为我必须使用[scanner charactersToBeSkipped],但我不知道它是如何工作的

解决方法

我想出了自己的解决方案。每次键入一个字符时,它都会检查第一个字符是否为破折号。如果是,它将跳过第一个字符,并检查字符串的其余部分是否包含整数。如果第一个字符不是破折号,它将扫描整个字符串中的整数。

- (BOOL)isPartialStringValid:(NSString *)partialString newEditingString:(NSString **)newString errorDescription:(NSString **)error {
    if ([partialString length] == 0) {
        return YES;
    }
    
    NSString *stringFromSecondChar;
    
    NSString *firstChar = [partialString substringToIndex:1];
    
    if ([partialString length] > 1 && [firstChar isEqualToString:@"-"]) {
        stringFromSecondChar = [partialString substringFromIndex:1];
    }
    else {
        stringFromSecondChar = partialString;
    }
    
    NSScanner *scanner = [NSScanner scannerWithString:stringFromSecondChar];
    
    if ([partialString length] == 1 && [firstChar isEqualToString:@"-"]) {
        return YES;
    }
    else if ([partialString length] >= 1 && [stringFromSecondChar containsString:@"-"]) {
        return NO;
    }
    
    if ([firstChar isEqualToString:@"-"]) {
        if (!([scanner scanInt:0] && [scanner isAtEnd])) {
            return NO;
        }
        else {
            return YES;
        }
    }
    
    if (!([scanner scanInt:0] && [scanner isAtEnd])) {
        return NO;
    }
    
    return YES;
}
,

具有正则表达式的解决方案:

- (BOOL)isPartialStringValid:(NSString *)partialString newEditingString:(NSString **)newString errorDescription:(NSString **)error {
    if (partialString.length == 0)
        return YES;
    NSRange range = [partialString rangeOfString:@"^[-]?\\d*$" options:NSRegularExpressionSearch];
    return (range.location != NSNotFound);
}

使用NSScanner的解决方案:

- (BOOL)isPartialStringValid:(NSString *)partialString newEditingString:(NSString **)newString errorDescription:(NSString **)error {
    if (partialString.length == 0 || [partialString isEqualToString:@"-"])
        return YES;
    NSScanner *scanner = [NSScanner scannerWithString:partialString];
    return ([scanner scanInt:NULL] && [scanner isAtEnd]);
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...