首页 > 解决方案 > 我正在使用 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],但我不知道它是如何工作的

标签: objective-ccocoansnumberformatternsscanner

解决方案


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

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

推荐阅读