項(xiàng)目需求:在價(jià)格輸入框中只能輸入數(shù)字和小數(shù)點(diǎn),有位數(shù)控制,且只能輸入兩位小數(shù)。
自己研究了網(wǎng)上提供的方法,多數(shù)是用NSCharacterSet來查找并控制輸入的字符,本人對(duì)NSCharacterSet類不是很了解,就總結(jié)了下,供以后方便翻看。
NSCharacterSet介紹
NSCharacterSet ,以及它的可變版本NSMutableCharacterSet,用面向?qū)ο蟮姆绞絹肀硎疽唤MUnicode字符。它經(jīng)常與NSString及NSScanner組合起來使用,在不同的字符上做過濾、刪除或者分割操作。另外,NSCharacterset是無需字符集合,主要用來判斷已知字符串是否包含制定字符集,而不可以用來保存字符串。
NSCharacterSet的各個(gè)枚舉類型的含義如下:
controlCharacterSet//控制符
whitespaceCharacterSet//空格
whitespaceAndNewlineCharacterSet//空格換行
decimalDigitCharacterSet//小數(shù)
letterCharacterSet//文字
lowercaseLetterCharacterSet//小寫字母
uppercaseLetterCharacterSet//大寫字母
nonBaseCharacterSet//非基礎(chǔ)
alphanumericCharacterSet//字母數(shù)字
decomposableCharacterSet//可分解
illegalCharacterSet//非法
punctuationCharacterSet//標(biāo)點(diǎn)
capitalizedLetterCharacterSet//大寫
symbolCharacterSet//符號(hào)
newlineCharacterSet//換行符
網(wǎng)上有很多利用NSCharacterSet類去除或替換字符串中的空格或者指定字符,這里不再探討,想要學(xué)習(xí)的話可以看下邊的參考文檔;和NSString類的切割和拼接一起使用可以達(dá)到想要的效果。
這里我只貼出解決項(xiàng)目需求的代碼來和大家一起學(xué)習(xí),筆者用的是OC語言做開發(fā)。
1.聲明宏
#define myDotNumbers @"0123456789.\n"
#define myNumbers @"0123456789\n"
2.實(shí)現(xiàn)方法
實(shí)現(xiàn)UITextField的代理方法
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
if ([textField.text isEqualToString:@"0"] && [string isEqualToString:@"0"]) {//不能連續(xù)輸入兩個(gè)以上的零
return NO;
}
if ([textField.text length] == 0 && [string isEqualToString:@"."]) {//首位不能輸入.
return NO;
}
if ([string isEqualToString:@"\n"]||[string isEqualToString:@""]) {//按下return
return YES;
}
NSCharacterSet *cs;
NSUInteger nDotLoc = [textField.text rangeOfString:@"."].location;
if (NSNotFound == nDotLoc && 0 != range.location) {
cs = [[NSCharacterSet characterSetWithCharactersInString:myNumbers]invertedSet];
if ([string isEqualToString:@"."]) {
return YES;
}
if (textField.text.length>=8) { //小數(shù)點(diǎn)前面8位
return NO;
}
}
else {
cs = [[NSCharacterSet characterSetWithCharactersInString:myDotNumbers]invertedSet];//invertedSet方法是去反字符,把所有的除了kNumber里的字符都找出來(包含去空格功能)
if([string isEqualToString:@"."]){
return NO;
}
if (textField.text.length>=11) {
return NO;
}
}
NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
BOOL basicTest = [string isEqualToString:filtered];
if (!basicTest) {
return NO;
}
if (NSNotFound != nDotLoc && range.location > nDotLoc +2) {//小數(shù)點(diǎn)后面兩位
return NO;
}
return YES;
}
參考文檔:
NSCharacter?Set
NSCharacterSet
NSCharacterSet的使用
蘋果官方文檔