NSScanner:一個陌生的條件判斷利器

NSScanner類是 一個類簇的抽象父類,該類為一個從nsstring對象掃描值的對象提供了程序接口;

NSScanner對象吧nsstring對象的字符串解釋和轉(zhuǎn)換成NUMBER和string類型值。在創(chuàng)建NSScanner對象時候為她分配字符string,當你從NSScanner對象獲取內(nèi)容的時候,她會從頭到尾遍歷字符串string;

由于類簇的屬性,scanner對象并不是NSScanner類 的實例,而是他的一個私有子類的實例。盡管scnner對象的類是私有的,但是它接口是公開的.NSScanner的原始方法是string和configurating a scnner方法;

在NSScanner掃描字符串時候,你可以通過設(shè)置屬性charactersToBeSkipped忽略某些字符,在掃描字符串之前,哪些位于忽略字符集中的字符串將會被跳過,默認的忽略字符串是空格和回車字符串;

可通過[[scnner string] substringFromIndex:[scanner scanLocation]]獲取未掃描的字符串;

創(chuàng)建scanner對象:

+(instancetype) scannerWithString:(NSString *)aString;

+(id)localizedScannerWithString:(NSString *)aString;

+(instancetype)initWithString:(NSString *)aString;

scannerWithString,返回值是掃描過aString字符串的NSScanner對象,該方法通過調(diào)用initWithString設(shè)置掃描字符串;

· localizedScannerWithString,返回值是通過用戶默認locale方式掃描字符串的NSScanner對象,該方法是通過調(diào)用initWithString設(shè)置掃描字符串;

· initWihString:返回值是NSScanner對象,該對象掃描aString完成初始化;

獲取NSScanner的字符串

@property(readonlu,copy)NSString * string;

配置NSScanner

@property NSUInteger scanLocation;

@property BOOL caseSensitive;

@property(copy) NsCharacterSet *CharacterSet;

@property(retain) id locale;

* ScanLocation: 下次掃描開始的位置,如果該值超出string 區(qū)域,將會引起NSRangeException,該屬性在發(fā)生錯誤后重新掃描時候灰常有用;

* caseSecsitive:是否區(qū)分大小寫,默認是NO;該設(shè)置不會應(yīng)用到被跳過的字符串;

*charactersToBeSkipped:在掃描時被跳過的字符串,默認是空格和回車。被跳過的字符集優(yōu)先于掃描的字符集:例如一個scanner被跳過的是空格,通過scanInt:去查找字符串中的整形數(shù)時候,首先做的不是掃描,而是跳過空格,直到找到十進制數(shù)據(jù)或者其他的字符串。在字符被掃描時候,跳過功能失效。如果掃描的字符串和跳過的是一樣的,結(jié)果將是未知的;被跳過的字符集是唯一的一個值,scanner不會講忽略大小寫的功能應(yīng)用于他,也不會用這些字符串做些組合。如果在掃描字符集時候你想忽略所有的元音字符:(將字符串設(shè)成:AEIOUAEIOU);

*locale,scanner的locale對他從字符串中區(qū)分數(shù)值產(chǎn)生影響,他通過locale的十進制分隔區(qū)分浮點數(shù)據(jù)的整數(shù)和小數(shù)部分。一個沒有l(wèi)ocale的scanner用非定域值。新的scanner若是沒有設(shè)置locale,默認使用locale;

掃描字符串

- (BOOL) scanCharactersFormSet:(NSCharacterSet *)scanSet intoString; (NSString * _Nullable *)stringValue;


- (BOOL)scanUpToCharactersFormSet : (NSCharacterSet *) stopSet intoString:(NSString * _Nullable *) stringVaule;

- (BOOL)scanString:(NSString *)string intoString:(NSString * _Nullable *)stringValue;

- (BOOL)scanUpToString:(NSString *)stopString intoString:(NSString * _Nullable *)stringValue;

- (BOOL)scanDecimal:(NSDecimal *) decimalValue;

- (BOOL)scanDouble:(double *)doubleValue;

- (BOOL)scanDouble:(double *)floatValue;

- (BOOL)scanHexDouble:(double *)result;

- (BOOL)scanHexFloat:(float *) result;

- (BOOL)scanHexInt:(unsigned int *) intValue;

- (BOOL)scanHexLongLong:(unsigned long long *) result;

- (BOOL)scanInt:(int *)intValue;

- (BOOL)scanInteger:(NSInteger *)value;

- (BOOL)scanUnsignedLongLong:(unsigned long long *)unsignedLongLongValue;

@property(getter=inAtEnd,readonly)BOOL atEnd;

scanCharactersFromSet:intoString:掃描字符串中和NSCharacterSet字符集匹配的字符,是按照字符單個匹配的,例如,NSCharacterSet字符集為@”test123demo“,SCANNER字符串為”123test12Demotest“,那么所有的子都都在字符集中,所有指針指向的地址存儲的內(nèi)容為”123test12demotest“;

* scanUpToScharactersFromSet:intoString:掃描字符串直到遇到NSCharactersSet字符集的字符時停止,指針指向的地址存儲的內(nèi)容為遇到跳過字符集字符之前的內(nèi)容;

*scanString:intoString:從當前的掃描位置開始掃描,判斷掃描字符串是否從當前位置能掃描到和傳入字符串相同的一串字符,如果能掃描到就返回YES,指針指向的地址存儲的就是這段字符串的內(nèi)容。例如scanner的內(nèi)容123abc678,傳入字符串內(nèi)容abc,如果當前掃描位置是0,那么掃描不到,但是如果將掃描位置設(shè)置為3,就可以掃描到了;

*scanUpToString:intoString:從當前掃描位置開始掃描,掃描到和傳入的字符串相同字符串時停止 ,指針指向的地址存儲的是遇到傳入字符串之前的內(nèi)容;例如scanner的string內(nèi)容為123abc68,傳入abc,存儲的內(nèi)容為123‘

*scanDecimal:掃描NSDecimal類型的值

*scanDouble:double類型

*scanFloat:float類型

*ScanHexDouble:雙精度十六進制類型,溢出和非溢出都被認為合法的浮點數(shù)據(jù);在溢出情況下scanner會跳過所有的數(shù)字,所以新掃描的位置將會在整個浮點型數(shù)據(jù)的后面。Double 指針指向的地址存儲的數(shù)據(jù)為掃描出的值,包括溢出時候HUGE_VAL或者-HUGE_VAL,即未溢出時的0.0.數(shù)據(jù)接收時對應(yīng)的格式為%a,%A,雙精度十六進制字符前面一定要加0X或者0x;

*scanHexInt:十六進制無符號整形,unsigned int指針指向的地址的值為掃描到的值,包含溢出時候UINT_MAX;

*scanHexLongLong同scanHexDouble;

*scanInt:掃描整形,溢出也被認為是有效的整形,int指針指向的地址的值為掃描到的值,包含溢出的INT_MAX或者INT_MIN.

*scanInteger:同scanInt;

*scanLongLong:掃描long long 類型,溢出也被認為是有效的類型,longlong指針指向的地址的值為掃描到的值,包含溢出時的LLONG_MAX或LLONG_MIN;



實例:

# import

@interface ConditionJudgmentController: NSObject

//輸入框中只能輸入數(shù)字和小數(shù)點,且小數(shù)點只能輸入一位,參數(shù) number可以設(shè)置小數(shù)的為數(shù),該函數(shù)在-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 調(diào)用;

+ (BOOL)isValidAboutInputText:(UITextField *)textfield shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string decimalNumber:(NSInteger) number;

@end

#import "CondittionJudgmentCintroller.h"

@implamentation ConditionJudgmentController

+ (BOOL)isValidAboutInputText:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string decimalNumber:(NSInteger )number{

????? NSSCanner *scanner = [NSScanner scannerWithString:string];

????? NSCharacterSet *numbers ;

???? NSRange pointRange = [textField.text rangeOfString:@"."];

??? if((pointRange.length > 0) && (pointRange.location < range.location ||?????? pointRange.location > range.location + range.length)){

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

}eles{

?? number = [NSCharacterSet characterSetWithCharactersInString:@"0123456789."];

}

if([textField.text isEqualToString:@""] && [string isEqualToString@"."]){

?return NO;

}

short remain = number;//保留NUMBER位小數(shù)

NSString *tempStr = [textField.text stringByAppendingString:string];

NSUInteger strLen = [tempStr length];

if(pointRange.length > 0 && pointRange.location > 0 ){

? //判斷輸入框內(nèi)是否含有"."

? if([string isEqualToString:@"."]){

??? return NO;//當輸入框內(nèi)已經(jīng)含有”.“時,再輸入".",則被視為無效;

}

? if([strlen > 0 && (strlen - pointRange.location) > remain + 1]){

?? return NO;//當輸入框內(nèi)已經(jīng)有”.“,當字符串長度減去小數(shù)點前面的字符串長度大于需要保留的小數(shù)點為數(shù),則視當次輸入無效。

}

}

NSRange zeroRange = [textField.text rangeOfString:@"0"];

if(zeroRange.length == 1 && zeroRange.location ==0){

??? //判斷輸入框第一個字符是否是”0“

??? if(![string isEqualToString:@"0" ![string isEqualToString:@"."] && ![textField.text length]==1]){

?? //當輸入框只有一個字符并且字符為0時,再輸入不為0或者.的字符時,則將此輸入替換輸入框的這唯一字符

??? textField.text = string;

??? return NO;

}else{

? if(pointRange.length == 0 && pointRange.location > 0 ){

?//當輸入框第一個字符為0,且沒有”.“,如果當此時輸入的字符為0,則視為檔次輸入無效;

? if([string isEqualToString:@"0"]){

?return NO;

}}}}

NSString *buffer;

if(![scanner scanCharactersFormSet:numbers intoString:&buffer] && ([string length] != 0 )){

?return NO;

}else{? return YES;

}

@end


注:結(jié)合UITEXTFIELD的代理使用

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{

?? return [ConditionJundgmentController isValidAboutInputText:textField shouldChangeCharactersInRange:range replacementString:string decimalNumber:3];

}



























































- (BOOL)scanDouble:(double *)doubleValue;- (BOOL)scanDouble:(double *)doubleValue;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內(nèi)容