【问题标题】:Only allow one decimal for each number in UITextView (Swift 4)UITextView 中的每个数字只允许一位小数(Swift 4)
【发布时间】:2020-10-22 20:53:28
【问题描述】:

我有一个UITextView,我在其中输入了一系列以空格分隔的数字(例如:“12.3 30 22.7 19.23 15 8.5 11”)。

UITextView 可能包含多个小数点,但我想确保没有单个数字包含超过一个小数位。

我发现的所有解决方案仅将整个 UITextView 限制为一个小数,而不是每个数字。

我该怎么做?

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    您可以在 UITextView 委托 func shouldEndEditing.. 中尝试类似的操作。

    func textViewShouldEndEditing(_ textView: UITextView) -> Bool {
        guard let numbers = textView.text else {
            return true
        }
        var hasMultipleDecimalPlaces: Bool = false
        let numbersAsList = numbers.split(separator: " ")
        for number in numbersAsList {
            let splitAtDecimal = number.split(separator: ".")
            if splitAtDecimal.count > 2 {
                if splitAtDecimal[1].count > 2 {
                    // This is what you want to prevent so break early and return false
                    hasMultipleDecimalPlaces = true
                    break
                }
            }
        }
        return !hasMultipleDecimalPlaces
    

    }

    这将阻止用户完成对文本视图的编辑。它总是可以用在像shouldReplaceCharactersIn这样的函数中

    【讨论】:

      【解决方案2】:

      我认为您应该使用此委托 textField(_:shouldChangeCharactersIn:replacementString:) 并自行检查每个数字并检查是否已经存在点。并返回 false 或 true。

      【讨论】:

        【解决方案3】:

        在文本视图委托方法中尝试正则表达式:

        let regex = try! NSRegularExpression(pattern: "^\\s*((-?)(\\d+\\.?|\\d*\\.\\d+))?(\\s+(-?)(\\d+\\.?|\\d*\\.\\d+))*\\s*$")
        
        func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
            // Compute the value of the text view after the text is inserted.
            let finalText = (textView.text as NSString).replacingCharacters(in: range, with: text) as NSString
            // Check against a regular expression.
            return regex.firstMatch(in: finalText as String, range: NSRange(location: 0, length: finalText.length)) != nil
        }
        

        您将不得不尝试您想要的行为: https://regex101.com

        【讨论】:

          【解决方案4】:

          最终结果:

          func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
          
              // only allow valid characters
              let validCharacters = " -0123456789.,|\t\n"
              guard CharacterSet(charactersIn: validCharacters).isSuperset(of: CharacterSet(charactersIn: text)) else {
                  return false
              }
              
              let oldText = txtViewDataInput.text!
              let r = Range(range, in: oldText)
              let text = oldText.replacingCharacters(in: r!, with: text)
              debugPrint("text = \(text)")
          
              let whiteSpace = " ,|\t\n"
              let separators = NSCharacterSet(charactersIn: whiteSpace)
          
              let tempArray = text.components(separatedBy: separators as CharacterSet)
          
              // do not allow more than one decimal point in a number
              for number in tempArray {
                  let splitAtDecimal = number.filter { $0 == "." }.count
                  if splitAtDecimal > 1 {
                      return false
                  }
              }
              return true
          }
          

          【讨论】:

            猜你喜欢
            • 2022-01-22
            • 1970-01-01
            • 1970-01-01
            • 2014-02-24
            • 1970-01-01
            • 2021-07-23
            • 1970-01-01
            • 2017-08-30
            相关资源
            最近更新 更多