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