IOS --NSScanner類的用法

      NSScanner是一個類,用於在字符串中掃描指定的字符,一般是將他們轉換成數字和別的字符串。咱們能夠在建立NSScanner時指定它的string屬性,而後scanner會按照咱們的要求從頭至尾掃描這個字符串的每一個字符。app

      建立一個NSScannerspa

      NSScanner是一個類族,一般咱們可使用scannerWithString或locallzedScannerWithString方法初始化一個scanner。這兩個方法都返回一個scanner對象,並用咱們傳遞的字符串參數初始化其string屬性。剛建立的scanner對象指向字符串的開頭。scanner方法開始掃描,好比有:scanInt、scanDouble、scanString:intoString。示例代碼以下:3d

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

以上例子會循環搜索字符串中的整型值,並賦值給val參數。isAtEnd方法會緊接上一次搜索到的字符位置繼續搜索,看是否存在下一個整型值,直到掃描結束。掃描的核心是字符位置的移動,位置在不停的掃描中移動,直至掃描結束。code

      Scanner的使用對象

      以字符串「132 panda lxl of apple」爲例,在掃描完一個整數以後,scanner的位置將變成3,也便是數字後面的空格處。scanner在任何操做時會跳過空白字符以後纔開始,當它找到一個能夠掃描的字符時,它會用所有字符去和指定內容匹配,scanner默認狀況下會忽略空白字符和換行符。ip

舉個實際例子:132 fushi pingguo of apple字符串

下面的代碼能夠找出蘋果的數量(132)和名稱(fushi)。string

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的位置指向了該字符串的開始處。此時,若是咱們想繼續掃描該字符串以後的字符,則同上面同樣,必須先掃描指定字符串(搜索字符串)。下面的代碼演示瞭如何跳過搜索字符串並取得產品類型,代碼以下:it

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

}

相關文章
相關標籤/搜索