我如何确定 NSString 真的是一个 int?

How can I be certain that a NSString is really an int?

我正在尝试验证 NSStringint。我有以下代码来尝试这样做:

if([[NSScanner scannerWithString:stringValue] scanInt:nil]){
//...
}

但是,如果 stringValue@"1.0something" 这仍然会 return 一个 YES 布尔值来检查我的 NSString 是否是 int.

有没有比这更准确的方法?

一个可能的解决方案是将 int 转换回 NSString 并查看它是否与原始字符串匹配。

NSString *oldStr = ... // your original string
NSString *newStr = [NSString stringWithFormat:@"%d", [oldStr intValue]];
if ([newStr isEqualToString:oldStr]) {
    // the string is a valid int value
}

您还可以扩展您的 NSScanner 检查并确保在您调用 scanInt: 后扫描器位于末尾。

NSScanner *scanner = [NSScanner scannerWithString:stringValue];
if ([scanner scanInt:nil] && [scanner atEnd]) {
    // valid int string
}

或者您可以确保字符串只包含字符 0-9:

if ([stringValue rangeOfCharacterFromSet:[[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet]].location == NSNotFound) {
    // valid int
}

或者您可以使用正则表达式。

这样检查

NSScanner* scan = [NSScanner scannerWithString:stringValue]; 
int val; 
return [scan scanInt:&val] && [scan isAtEnd];

您可以使用 NSNumberFormatter 来确定字符串是否为有效数字:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.numberStyle = NSNumberFormatterDecimalStyle;
[formatter numberFromString:@"1.0"]; // returns @(1)
[formatter numberFromString:@"1.0something"]; // returns nil

由于默认情况下未启用部分字符串验证,因此它将拒绝未完全验证为数字的字符串。