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];