IOS --NSScanner类的用法

      NSScanner是一个类,用于在字符串中扫描指定的字符,通常是将他们转换成数字和别的字符串。我们可以在创建NSScanner时指定它的string属性,然后scanner会按照我们的要求从头到尾扫描这个字符串的每个字符。

      创建一个NSScanner

      NSScanner是一个类族,通常我们可以使用scannerWithString或locallzedScannerWithString方法初始化一个scanner。这两个方法都返回一个scanner对象,并用我们传递的字符串参数初始化其string属性。刚创建的scanner对象指向字符串的开头。scanner方法开始扫描,比如有:scanInt、scanDouble、scanString:intoString。示例代码如下:

int val;
NSScanner *theScanner = [NSScanner scannerWithString:aString]; 
while([theScanner isAtEnd] == NO)
{
   [theScanner scanInt:&val];
}

以上例子会循环搜索字符串中的整型值,并赋值给val参数。isAtEnd方法会紧接上一次搜索到的字符位置继续搜索,看是否存在下一个整型值,直到扫描结束。扫描的核心是字符位置的移动,位置在不停的扫描中移动,直至扫描结束。

      Scanner的使用

      以字符串“132 panda lxl of apple”为例,在扫描完一个整数之后,scanner的位置将变成3,也即是数字后面的空格处。scanner在任何操作时会跳过空白字符之后才开始,当它找到一个可以扫描的字符时,它会用全部字符去和指定内容匹配,scanner默认情况下会忽略空白字符和换行符。

举个实际例子:132 fushi pingguo of apple

下面的代码可以找出苹果的数量(132)和名称(fushi)。

NSString *apple = @"132 fushi pingguo of apple";
NSString *separateString = @" of";//注意of前面有一个空格
NSScanner *aScanner = [NSScanner scannerWithString:apple];
NSInteger anInteger;
[aScanner scanInteger:&anInteger];//得到数量132
NSString *name;
[aScanner scanUpToString:separateString intoString:&name];//得到名称fushi pingguo

查找字符串separateString为"of"很重要,scanner默认会忽略空白字符,因此数字132后面的空格会被忽略。但是当scanner从空格后面的字符开始扫描时,所有的字符都会被加载到输出字符串中,一直到遇到搜索字符串"of"。

注意:如果搜索字符串是“of”,(前面没空格),name的值应该是"fushipingguo "(最后面有个空格);如果搜索字符串是" of",(前面有空格),则name的值为"fushi pingguo"(最后面无空格)。在扫描到指定字符串(搜索字符串)后,scanner的位置指向了该字符串的开始处。此时,如果我们想继续扫描该字符串之后的字符,则同上面一样,必须先扫描指定字符串(搜索字符串)。下面的代码演示了如何跳过搜索字符串并取得产品类型,代码如下:

[aScanner scanString:separateString intoString:NULL];
NSString *product;
product = [[aScanner string] substringFromIndex:[aScanner scanlocation]];

实例:

假设我们有如下字符串:

Product:Lxl Panda Peter;Cost:0.23 87

Product:Xiong Mao Bet;Cost:0.38 76

Product:San Di Sex;Cost:1.29 3

以下代码演示了读取产品名称和价格(float类型)的操作,跳过"Product:"和"Cost:"字串以及";"号。

NSString *Sumstring = @"Product:Lxl Panda Peter;Cost:0.23 87\n\
Product:Xiong Mao Bet;Cost:0.38 76\n\
Product:San Di Sex;Cost:1.29 3\n";
NSCharacterSet *semicolonSet;
NSScanner *theScanner;
NSString *PRODUCT =@"Product:";
NSString *COST = @"Cost:";
NSString *productNmae;
float productCost;
NSInteger productSold;
semicolonset = [NSCharacterSet charactSetWithCharactersInString:@";"];
theScanner = [NSScanner scannerWithString:Sumstring];
while([theScanner isAtEnd] == NO)
{
    if([theScanner scanString:PRODUCT intoString:NULL] &&
       [theScanner scanUpToCharactersFrom:semicolonSet intoString:&productNmae]&&
       [theScanner scanString:@";" intoString:NULL]&&
       [theScanner scanString:COST intoString:NULL]&&
       [theScanner scanFloat:&productCost]&&
       [theScanner scanInteger:&productSold])
    {
         NSLog(@"Sales of %@:$%1.2f",productNmae,productCost*productSold);
    }
}

实例结束

实例二

从字符串中提取数字

-(void)findNumFromStr

{

    NSString *originalString = @"a1b2c3d4e5f6g7h8i9j0";

    NSMutableString *numberString = [[NSMutableString alloc] init];

    NSString *tempStr;

    NSScanner *scanner = [NSString scannerWithString:originalString];

    NSCharacterSet *numbers = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];

    while(![scanner isAtEnd])

    {

         [scanner scanUpToCharactersFromSet:numbers intoString:NULL];

         [scanner scanCharactersFromSet:numbers intoString:&tempStr];

         [numberString appendString:tempStr];

         tempStr = @"";

    }  

    int number = [numberString integerValue];

    return number;                  

}


你可能感兴趣的:(IOS --NSScanner类的用法)