设置UITextField小数点保留两位,其他字符拒绝输入
2017-08-11 本文已影响211人
DSA碼侬
要求:
文本框只能输入数字,且最多可以保留两位有效数字。 除了数字与小数点 其他字符一概不准输入
1、设置文本框tf的代理与keyboardType 属性
self.tf.delegate = self;
/**
UIKeyboardTypeNumberPad // 只能是数字 在系统键盘上没有小数点的输入
UIKeyboardTypePhonePad // 存在+ * # 以及数字 没有小数点
UIKeyboardTypeDecimalPad // 只能是数字 在系统键盘上有小数点的输入
*/
self.tf.keyboardType = UIKeyboardTypeDecimalPad;
2、实现代理的以下这个方法
#pragma mark - UITextFieldDelegate
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
// _textFiledM1 项目中的tf控件
if (textField == _tf) {
// 1 不能直接输入小数点
if ( [textField.text isEqualToString:@""] && [string isEqualToString:@"."] ) return NO;
// 2 输入框第一个字符为“0”时候,第二个字符如果不是“.”,那么文本框内的显示内容就是新输入的字符[textField.text length] == 1 防止例如0.5会变成5
NSRange zeroRange = [textField.text rangeOfString:@"0"];
if(zeroRange.length == 1 && [textField.text length] == 1 && ![string isEqualToString:@"."]){
textField.text = string;
return NO;
}
// 3 保留两位小数
NSUInteger remain = 2;
NSRange pointRange = [textField.text rangeOfString:@"."];
// 拼接输入的最后一个字符
NSString *tempStr = [textField.text stringByAppendingString:string];
NSUInteger strlen = [tempStr length];
// 输入框内存在小数点, 不让再次输入“.” 或者 总长度-包括小数点之前的长度>remain 就不能再输入任何字符
if(pointRange.length > 0 &&([string isEqualToString:@"."] || strlen - (pointRange.location + 1) > remain))
return NO;
// 4 小数点已经存在情况下可以输入的字符集 and 小数点还不存在情况下可以输入的字符集
NSCharacterSet *numbers = (pointRange.length > 0)?[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] : [NSCharacterSet characterSetWithCharactersInString:@"0123456789."];
NSScanner *scanner = [NSScanner scannerWithString:string];
NSString *buffer;
// 判断string在不在numbers的字符集合内
BOOL scan = [scanner scanCharactersFromSet:numbers intoString:&buffer];
if ( !scan && ([string length] != 0) ) // 包括输入空格scan为NO, 点击删除键[string length]为0
{
return NO;
}
}
return YES;
}
3、如果允许输入负数,代码调整如下所示:
// 1、添加代码
if ([string isEqualToString:@"-"] && [textField.text length] != 0)
return NO;
// 2、修改代码字符串加入负号 @"-0123456789."
// 4 小数点已经存在情况下可以输入的字符集 and 小数点还不存在情况下可以输入的字符集
NSCharacterSet *numbers = (pointRange.length > 0)?[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] : [NSCharacterSet characterSetWithCharactersInString:@"-0123456789."];