美文网首页
输入框小数位限制

输入框小数位限制

作者: coenen | 来源:发表于2020-09-09 10:05 被阅读0次

目前做输入框常用的控件就是textField 和 textView. 那么平时的场景是什么呢?
1、输入要求不能超过多大的值
2、保留2位小数
3、金额输入.....

在遇到这样的需求时,常常会针对不同的要求做不同的限制.
在这里我们稍稍分享一下技术实现的细节
这个主要思路还是通过控制文本的输入来进行校验的.

/// 小数位数
var decimalCount: Int

/// 最大值
var maxNum: Double

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange,     
replacementString string: String) -> Bool {
    let futureString: NSMutableString = NSMutableString(string: textField.text!)
     futureString.insert(string, at: range.location)
     var flag = 0;
     let limited = decimalLimited;//小数点后需要限制的个数
     if !futureString.isEqual(to: "") {
         for i in stride(from: (futureString.length - 1), through: 0, by: -1) {
             let char = Character(UnicodeScalar(futureString.character(at: i))!)
             if char == "." {
                 if flag > limited {
                     return false
                 }
                 break
             }
             flag += 1
         }
     }

    /// 限制大小
    var dealString = textField.text ?? "" + string
    if range.length == 0 {
    }else if range.length == 1{
        dealString.removeSubrange(Range.init(range, in: dealString)!)
    }
    let result = Double(dealString) ?? 0
    
    if text == "." && ((textField.text?.contains(".")) != nil){
        return false
    }
    return (result <= maxNumLimited)
}

在这说下这个过程:
首先判断小数位数,
然后去限制大小. 通过 range.length 来判断是输入还是删除.
然后控制只能输入一个小数点,防止输入多个
最后控制输入的值是否超过最大值.

  func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    let futureString: NSMutableString = NSMutableString(string: textView.text!)
     futureString.insert(text, at: range.location)
     
     var flag = 0;
     
     let limited = decimalLimited;//小数点后需要限制的个数
     
     if !futureString.isEqual(to: "") {
         for i in stride(from: (futureString.length - 1), through: 0, by: -1) {
             let char = Character(UnicodeScalar(futureString.character(at: i))!)
             if char == "." {
                 if flag > limited {
                     return false
                 }
                 break
             }
             flag += 1
         }
     }

    /// 限制大小
    var dealString = textView.text + text
    
    if range.length == 0 {
    }else if range.length == 1{
        dealString.removeSubrange(Range.init(range, in: dealString)!)
    }
    
    let result = Double(dealString) ?? 0
    
    if text == "." && textView.text.contains("."){
        return false
    }
    return (result <= maxNumLimited)
}

目前算是一个简版,可以通过控制键盘,来进行输入限制.
也可以通过正则方式来控制.随后再更新即可.

!!!稍稍做了改动,由delegate改为方法调用,在外部挂上代理后,在shouldChangeTextIn方法中调用即可.防止外部代理导致内部无效.

textField和textView的实现思路是一致的.不再赘述,具体可以参考Demo即可.

相关文章

网友评论

      本文标题:输入框小数位限制

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