Я использую NSScanner для ограничения значения текстового поля только числами, но я хочу разрешить «-«

#objective-c #cocoa #nsnumberformatter #nsscanner

#objective-c #какао #nsnumberformatter #nsscanner

Вопрос:

У меня есть NSScanner в пользовательском NSNumberFormatter, который сканирует значения, отличные от int, но я хочу, чтобы он пропускал «-» (тире)

 - (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] amp;amp; [scanner isAtEnd])) {
        return NO;
    }
    
    return YES;
}
  

Я думал, что должен использовать [scanner charactersToBeSkipped] , но я не знаю, как это работает

Комментарии:

1. И в чем именно заключается вопрос?

2. Как я могу разрешить использование тире в текстовом поле?

3. Но почему? Это потому, что строка допустима, только если она является целым числом, а целое число может быть отрицательным? В таком случае, может быть, NSScanner — не лучший способ сделать это?

4. Да, вот почему. Что вы предлагаете мне делать вместо использования NSScanner?

5. Возможно, вы могли бы использовать для этого регулярное выражение.

Ответ №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 amp;amp; [firstChar isEqualToString:@"-"]) {
        stringFromSecondChar = [partialString substringFromIndex:1];
    }
    else {
        stringFromSecondChar = partialString;
    }
    
    NSScanner *scanner = [NSScanner scannerWithString:stringFromSecondChar];
    
    if ([partialString length] == 1 amp;amp; [firstChar isEqualToString:@"-"]) {
        return YES;
    }
    else if ([partialString length] >= 1 amp;amp; [stringFromSecondChar containsString:@"-"]) {
        return NO;
    }
    
    if ([firstChar isEqualToString:@"-"]) {
        if (!([scanner scanInt:0] amp;amp; [scanner isAtEnd])) {
            return NO;
        }
        else {
            return YES;
        }
    }
    
    if (!([scanner scanInt:0] amp;amp; [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] amp;amp; [scanner isAtEnd]);
}