项目需求:在价格输入框中只能输入数字和小数点,有位数控制,且只能输入两位小数。
自己研究了网上提供的方法,多数是用NSCharacterSet来查找并控制输入的字符,本人对NSCharacterSet类不是很了解,就总结了下,供以后方便翻看。
NSCharacterSet介绍
NSCharacterSet ,以及它的可变版本NSMutableCharacterSet,用面向对象的方式来表示一组Unicode字符。它经常与NSString及NSScanner组合起来使用,在不同的字符上做过滤、删除或者分割操作。另外,NSCharacterset是无需字符集合,主要用来判断已知字符串是否包含制定字符集,而不可以用来保存字符串。
NSCharacterSet的各个枚举类型的含义如下:
controlCharacterSet//控制符
whitespaceCharacterSet//空格
whitespaceAndNewlineCharacterSet//空格换行
decimalDigitCharacterSet//小数
letterCharacterSet//文字
lowercaseLetterCharacterSet//小写字母
uppercaseLetterCharacterSet//大写字母
nonBaseCharacterSet//非基础
alphanumericCharacterSet//字母数字
decomposableCharacterSet//可分解
illegalCharacterSet//非法
punctuationCharacterSet//标点
capitalizedLetterCharacterSet//大写
symbolCharacterSet//符号
newlineCharacterSet//换行符
网上有很多利用NSCharacterSet类去除或替换字符串中的空格或者指定字符,这里不再探讨,想要学习的话可以看下边的参考文档;和NSString类的切割和拼接一起使用可以达到想要的效果。
这里我只贴出解决项目需求的代码来和大家一起学习,笔者用的是OC语言做开发。
1.声明宏
#define myDotNumbers @"0123456789.\n"
#define myNumbers @"0123456789\n"
2.实现方法
实现UITextField的代理方法
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
if ([textField.text isEqualToString:@"0"] && [string isEqualToString:@"0"]) {//不能连续输入两个以上的零
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) { //小数点前面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) {//小数点后面两位
return NO;
}
return YES;
}
参考文档:
NSCharacterSet
NSCharacterSet
NSCharacterSet的使用
苹果官方文档