【问题标题】:Eliminate multiple decimal points in number (swift)消除数字中的多个小数点(swift)
【发布时间】:2020-09-09 16:08:13
【问题描述】:

我想将用户输入限制为仅有效数字,并且正在使用以下内容:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    guard CharacterSet(charactersIn: " -0123456789.,\t\n").isSuperset(of: CharacterSet(charactersIn: text)) else {
        return false
    }
    return true
}

但这并不妨碍输入多个小数点,例如“1.2.3”。有没有简单的方法来防止这种情况?

【问题讨论】:

  • 这能回答你的问题吗? UITextField Should accept number only values
  • 您要输入货币吗?
  • 你要从 UITextView 中读取一个数字数组吗?
  • @pkamb:它可能会,但它只涵盖 UITxtFields,而不是 UITextViews...
  • @Leo Dabus:不,但我也许可以使用它...

标签: ios swift formatting


【解决方案1】:

尝试使用这个例子

guard CharacterSet(charactersIn: " -0123456789.,\t\n").isSuperset(of: CharacterSet(charactersIn: text)) else {
        return false
    }
    
    var newText = (textView.text as NSString).replacingCharacters(in: range, with: text)
    newText = newText.replacingOccurrences(of: ",", with: ".")
    
    let strings = newText.split { character -> Bool in
        return character == "\t" || character == "\n"
    }
    
    let numbers: [Double] = strings.compactMap { Double($0) }
    
    return strings.count == numbers.count

【讨论】:

    【解决方案2】:

    这是几年前@whyceewhite 对文本字段的回答。一种方法是使用NumberFormatter() 来确定该值是否为有效数字。

    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
            let numberFormatter = NumberFormatter()
            numberFormatter.numberStyle = .decimal
            return numberFormatter.number(from: textView.text + text) != nil
        }
    

    也许您还想处理用户输入小数作为数字的第一个值的情况,当放入数字格式化程序时将返回 nil。您可以使用如下内容:

    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
            if (textView.text == nil || textView.text == "") && text == "." {
                textView.text = "0"
                return true
            } else {
                let numberFormatter = NumberFormatter()
                numberFormatter.numberStyle = .decimal
                return numberFormatter.number(from: textView.text + text) != nil
            }
        }
    

    这将检查文本字段文本是 nil 还是空以及要插入的值是 .,添加前导零,然后添加小数。

    【讨论】:

      猜你喜欢
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 2018-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多