如何限制UITextField中的十进制输入值

时间:2019-01-26 17:17:26

标签: ios swift uitextfield

我当前正在检查自己的UITextField,该按钮设置为在shouldChangeCharactersIn中显示数字键盘,以将输入限制为仅一个小数点分隔符和仅2个小数点,例如{{3} }):

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    let decimalSeparator = String(Locale.current.decimalSeparator ?? ".")

    if (textField.text?.contains(decimalSeparator))! {

        let limitDecimalPlace = 2
        let decimalPlace = textField.text?.components(separatedBy: decimalSeparator).last

        if (decimalPlace?.count)! < limitDecimalPlace {

            return true

        } else {

           return false

        }

    }

}

这很好。但是,现在可以插入用户想要的任何值,我希望将其限制为小于999的值。我曾经检查长度以仅允许3个字符,但是现在我希望允许以下值(例如) :

143
542.25
283.02
19.22
847.25

但是我不想允许:

2222
3841.11
999.99

我该怎么办?

1 个答案:

答案 0 :(得分:1)

您可能需要两项检查:

  1. 确保采用xxx.xx的形式。这种模式匹配通常通过使用正则表达式搜索来实现。

    这里的技巧是确保支持带小数位和不带小数位的所有排列,其中小数位是两位或更少的数字,整数位是三位或更少的数字。

  2. 尝试将其转换为数字,并检查该值是否小于999。

因此:

let formatter = NumberFormatter()

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let candidate = ((textField.text ?? "") as NSString).replacingCharacters(in: range, with: string)
    let separator = formatter.decimalSeparator!

    if candidate == "" { return true }

    let isWellFormatted = candidate.range(of: "^[0-9]{1,3}([\(separator)][0-9]{0,2})?$", options: .regularExpression) != nil

    if isWellFormatted,
        let value = formatter.number(from: candidate)?.doubleValue,
        value >= 0,
        value < 999 {
            return true
    }

    return false
}

注意:

  • 我假设您希望用户能够遵守其设备的本地化设置(例如,让德国用户输入123,45,因为他们使用,作为小数点分隔符)。

  • p>
  • 如果您不习惯使用正则表达式,则正则表达式"^[0-9]{1,3}([\(separator)][0-9]{0,2})?$”可能看起来有点毛茸茸。

    • ^匹配字符串的开头;
    • [0-9]显然与任何数字匹配;
    • {1,3}可以匹配一到三个整数;
    • (...)?说“可选地,寻找以下内容”;
    • 同样,[0-9]{0,2}的意思是“介于零和两个小数位之间;和
    • $匹配字符串的结尾。