首页投稿(暂停使用,暂停投稿)

设置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."];
上一篇下一篇

猜你喜欢

热点阅读