我允许的金额格式为
XXXXXX - 要么 - xxxxxx.xx
量正则表达式字符串有很多问题(独立于平台。 然而问题是所有这些问题都假设它们仅在完全输入后用于验证数量字符串。
但我需要的是一个正则表达式,它将作为你键入的键入的过滤器。这意味着,根据顶部的要求,您应该能够将其键入文本字段,并且验证逻辑应该报告匹配的内容完全匹配。
0 0。 0.01
答案 0 :(得分:0)
这是一种在“键入时检查”方案中执行此类验证的相当直观的方法:
^(?=\d*\.?\d*$)(?!0\d|\d{7}|\d+\.\d(0|\d\d))
第一部分中的正向前瞻符合可接受的一般模式,第二部分中的否定前瞻符合您的规则。
答案 1 :(得分:-1)
量正则表达式字符串存在很多问题(与平台无关。但问题是所有这些问题都假设它们仅在完全输入后用于验证字符串数量。
由此我推断您创建满足您要求的正则表达式没有问题,只有问题是实现它。
为了在输入时过滤不需要的输入,您需要在UITextFieldDelegate
方法textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let regex = "^(?=\\d*\\.?\\d*$)(?!0\\d|\\d{7}|\\d+\\.\\d(0|\\d\\d))"
guard var amountString = textField.text else {
return false
}
amountString += string
if amountString.range(of: regex, options: .regularExpression) == nil {
return false
}
return true
}
在您的班级中继承UITextFieldDelegate
,将UITextField
的代表分配给self
,您就可以了。
哦,作为奖励我试着没有正则表达式。似乎工作。去第一个,除非你有反对正则表达式的东西。
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard var amountString = textField.text else {
return false
}
amountString += string
if !isNumber(amountString) {
return false
}
if (amountString.first == "0") {
if amountString.count == 2 && amountString != "0." {
return false
}
}
if let indexOfDecimal = amountString.index(of: ".") {
let decimalString = String((String(amountString[(indexOfDecimal)...])).dropFirst())
if (decimalString.count > 2 || decimalString == "00") {
return false
}
} else if (amountString.count > 6 && string != ".") {
return false
}
return true
}
func isNumber(_ s: String) -> Bool {
return Float(s) != nil
}