我当前正在检查自己的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
我该怎么办?
答案 0 :(得分:1)
您可能需要两项检查:
确保采用xxx.xx
的形式。这种模式匹配通常通过使用正则表达式搜索来实现。
这里的技巧是确保支持带小数位和不带小数位的所有排列,其中小数位是两位或更少的数字,整数位是三位或更少的数字。
尝试将其转换为数字,并检查该值是否小于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
,因为他们使用,
作为小数点分隔符)。
如果您不习惯使用正则表达式,则正则表达式"^[0-9]{1,3}([\(separator)][0-9]{0,2})?$”
可能看起来有点毛茸茸。
^
匹配字符串的开头; [0-9]
显然与任何数字匹配; {1,3}
可以匹配一到三个整数; (...)?
说“可选地,寻找以下内容”; [0-9]{0,2}
的意思是“介于零和两个小数位之间;和$
匹配字符串的结尾。