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

Objective c 使用NSScanner查找字符串中的所有数字,objective-c,string,number-formatting,nsnumber,nsscanner,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]

我使用下面的代码从
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;
    }
}
NSString*inputString=@“Dhoni7 NOUT at183*在145中运行,并且在15个四位和10个六位100中运行”;
NSString*numberString;
NSArray*元素=[inputString组件由字符串分隔:@”“];

对于(int i=0;i而言,您的错误很简单:您是从错误的假设开始的。您人为地将字符串分隔为单词:

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

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

马特的速度稍微快了一点。 你为什么一开始就把绳子分开?
稍微重新排列一下代码将得到所需的结果:

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;
    }
}
输出

七, 183 145 15 10 一百

注意
你也可以使用

NSCharacterSet *numbers = [NSCharacterSet decimalDigitCharacterSet];

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

当然我可以为您编写代码,但这不会给您带来任何挑战!我更愿意教您如何思考这个问题并让您解决它。你已经非常接近拥有你所需要的所有代码了…!@matt:这对我来说非常有效。非常感谢。你帮我想得很周到:)我所做的就是,删除字符串分隔代码,用
替换for循环([scanner isattend]==否)
实际上,这比我说的还要好,因为不是测试
isattend
,而是使用
scan…
返回BOOL的事实用
while(true)
写一个看似无休止的循环是很可怕的,但实际上这是正确的方法。是的,我知道
while(true)
不是最好的,但我不认为有办法将两个扫描操作都置于这种状态。您可以添加一个bool值,指示它再也找不到一个数字了……零不是一个数字吗?您应该使用
strtol()
检测允许错误检测的数字;有些东西
[NSString integerValue]
不起作用。嗯,我需要稍微清理一下代码,这是真的,但是会检测到
0
。这要好得多,而且我建议使用
strtol()
在这种情况下没有真正的帮助,如果您知道,
numberString
@matt中只能有数字绝对正确。为什么会有人否决这个问题?这是一个合理的答案,至少这不是另一个“为我写这个”的问题。
NSCharacterSet *numbers = [NSCharacterSet decimalDigitCharacterSet];