文档章节

IOS --NSScanner类的用法

求是科技
 求是科技
发布于 2015/02/26 14:42
字数 972
阅读 586
收藏 1

      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;                  

}


© 著作权归作者所有

共有 人打赏支持
求是科技
粉丝 89
博文 453
码字总数 228281
作品 0
成都
后端工程师
[C++][IO]fstream用法

fstream用法 1. 打开文件 在fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是: void open(const char* filename,int mode,int access); 参数: filename:  要打开的文件...

guitar_zp
2011/08/09
0
0
C++文件读写详解(ofstream,ifstream,fstream)

在看C++编程思想中,每个练习基本都是使用ofstream,ifstream,fstream,以前粗略知道其用法和含义,在看了几位大牛的博文后,进行整理和总结: 这里主要是讨论fstream的内容: [java] view pl...

涩女郎
2015/08/19
0
0
iOS精美过度动画、视频会议、朋友圈、联系人检索、自定义聊天界面等源码

iOS精选源码 iOS 精美过度动画源码(http://www.code4app.com/thread-14827-1-1.html) iOS简易聊天页面以及容联云IM自定义聊天页面的实现思路(http://www.code4app.com/thread-30348-1-1.htm...

sunnyaigd
07/11
0
0
react native 集成人脸识别 --ios

上一篇介绍了 android 端的集成 这篇介绍下ios的集成. 整体思路和android类似:ios原生这边集成sdk后,写个ios和RN的交互类,暴露给RN ,RN再调用 跳转人脸识别页。成功,或失败 内部sdk中有...

JsLin_
07/24
0
0
iOS基础深入补完计划--NSURLSession使用详解(附Demo)

目录 前言 API Demo 前言 本文主要是把NSURLSession以及NSURLSessionTask相关的代理方法全部整理了一下。 旨在大体了解在一个iOS网络请求中、一个任务究竟经理了什么。 而我们、又能做些什么...

kirito_song
05/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

docker中安装了RabbitMQ后无法访问其Web管理页面

在官网找了"$ docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 rabbitmq:3-management"这条安装命令,在docker上安装了RabbitMQ,,结果输入http://localhost:8080并不......

钟然千落
30分钟前
0
0
spring-cloud | 分布式session共享

写在前面的话 各位小伙伴,你们有福了,这一节不仅教大家怎么实现分布式session的问题,还用kotlin开发,喜欢kotlin的小伙伴是不是很开心! 以前在写Android的时候,就对客户端请求有一定的认...

冯文议
50分钟前
0
0
c语言之内存分配笔记

先看一个数组: short array[5] = {1,2} // 这儿定义的一个int类型的数组,数组第1和第2个元素值是1和2.其余后面默认会给值为0; 或者 short array[] = {1,2};//这儿数组第1和第2个元素,数组...

DannyCoder
今天
4
0
Shell | linux安装包不用选择Y/N的方法

apt-get install -y packageOR echo "y" | sudo apt-get install package

云迹
今天
2
0
Hadoop的大数据生态圈

基于Hadoop的大数据的产品圈 大数据产品的一句话概括 Apache Hadoop: 是Apache开源组织的一个分布式计算开源框架,提供了一个分布式文件系统子项目(HDFS)和支持MapReduce分布式计算的软件架...

zimingforever
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部