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;