美文网首页首页投稿(暂停使用,暂停投稿)
设置UITextField小数点保留两位,其他字符拒绝输入

设置UITextField小数点保留两位,其他字符拒绝输入

作者: DSA碼侬 | 来源:发表于2017-08-11 14:49 被阅读211次

    要求:

    文本框只能输入数字,且最多可以保留两位有效数字。 除了数字与小数点 其他字符一概不准输入

    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."];

    相关文章

      网友评论

        本文标题:设置UITextField小数点保留两位,其他字符拒绝输入

        本文链接:https://www.haomeiwen.com/subject/isohrxtx.html