使用NSScanner查找字符串中的所有数字

时间:2015-05-24 15:03:22

标签: objective-c string number-formatting nsnumber nsscanner

我使用以下代码使用inputString

NSScanner中提取数字
NSString *inputString = @"Dhoni7 notout at183*runs in 145andhehit15four's and10sixers100";
NSString *numberString;
NSArray *elements = [inputString componentsSeparatedByString:@" "];
for (int i=0; i<[elements count];i++)
{
    NSScanner *scanner = [NSScanner scannerWithString:[elements objectAtIndex:i]];
    NSCharacterSet *numbers = [NSCharacterSet characterSetWithCharactersInString:@"1234567890"];

    // Throw away characters before the first number.
    [scanner scanUpToCharactersFromSet:numbers intoString:NULL];

    // Collect numbers.
    [scanner scanCharactersFromSet:numbers intoString:&numberString];

    // Result.
    int number = [numberString integerValue];
    if (number != 0)
    {
        NSLog(@"%d\n",number);
        numberString = nil;
    }
}

我的预期输出是 7 183 145 15 10 100

但我得到的输出是 7 183 145 10

它只是从每个单词中提取第一个出现的数字。例如:如果它的Dho7ni89它只检测到7并且没有检测到89.如果有人帮我找到解决方法,我会很高兴。

2 个答案:

答案 0 :(得分:10)

马特的速度要快一点。 为什么你在开头拆分你的字符串?
一点点代码重新排列将产生所需的结果:

NSScanner *scanner = [NSScanner scannerWithString:@"Dhoni7 notout at183*runs in 145andhehit15four's and10sixers100"];
NSCharacterSet *numbers = [NSCharacterSet characterSetWithCharactersInString:@"1234567890"];

while (true) {
    // Throw away characters before a number
    [scanner scanUpToCharactersFromSet:numbers intoString:NULL];

    // Read the number
    NSString *numberString;
    if ([scanner scanCharactersFromSet:numbers intoString:&numberString]) {
        long number = [numberString integerValue];
        NSLog(@"%ld\n",number);
    } else {
        break;
    }
}

对外输出

  

7   183   145   15   10   100

注意
你也可以使用

NSCharacterSet *numbers = [NSCharacterSet decimalDigitCharacterSet];

过滤掉这些数字。我发现这比列出字符要简洁一些。但是,它将包括例如印度语脚本和阿拉伯语的十进制数字。

答案 1 :(得分:8)

你的错误很简单:你已经开始做出错误的假设。你人为地将字符串分成单词:

NSArray *elements = [inputString componentsSeparatedByString:@" "];
for (int i=0; i<[elements count];i++) {
    // scan for one number
}

因此,这正是发生的事情。扫描每个以查找一个号码,一次。如果一个单词包含两个数字,则永远不会扫描第二个数字 - 因为这不是您所说的。

解决方案是停止做出错误的假设。不要将字符串分成单词!只是不断重复这个过程:

* scan up to a number
* scan the number

...直到您到达扫描仪的字符串末尾(isAtEnd)。