问题描述
我在自定义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]);
}