【问题标题】:I'm using NSScanner to restrict a text field's value to numbers only, but I want to allow "-"我正在使用 NSScanner 将文本字段的值限制为仅数字,但我想允许“-”
【发布时间】:2020-10-04 23:30:39
【问题描述】:

我在自定义 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],但我不知道它是如何工作的

【问题讨论】:

  • 问题到底是什么?
  • 如何允许在文本字段中使用破折号?
  • 但是为什么呢?是不是因为字符串只有是整数才有效,而整数可以是负数?在那种情况下,可能是 NSScanner 不是最好的方法吗?
  • 是的,这就是原因。你建议我做什么而不是使用 NSScanner?
  • 您可以为此使用正则表达式。

标签: objective-c cocoa nsnumberformatter nsscanner


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    用正则表达式解决:

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

    【讨论】:

      猜你喜欢
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 2015-08-29
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多