输入金额的正则表达式?

时间:2017-10-11 00:18:07

标签: ios regex uitextfield

我允许的金额格式为

XXXXXX  - 要么 - xxxxxx.xx

  • 分数是可选的
  • 整个部分最多6位小数
  • 小数部分的最多2位小数
  • 点分隔整个和分数部分
  • 如果第一个char为零,则之后只允许一个点。
  • 只允许一个点
  • 如果第一个字符也为零,则Donot允许在分数的第二个小数位上为零。

量正则表达式字符串有很多问题(独立于平台。 然而问题是所有这些问题都假设它们仅在完全输入后用于验证数量字符串。

但我需要的是一个正则表达式,它将作为你键入的键入的过滤器。这意味着,根据顶部的要求,您应该能够将其键入文本字段,并且验证逻辑应该报告匹配的内容完全匹配。

0 0。 0.01

2 个答案:

答案 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
}