验证String是否为货币格式

时间:2015-05-14 18:33:32

标签: ios swift currency string-interpolation

我正在尝试在swift中创建一个接收String并返回Bool的方法。如果String是正确的货币格式,我想返回true,如果不是,则返回false。

到目前为止,这是我尝试过的方法:

func textIsValidCurrencyFormat(text: String) -> Bool {
    var isValidCurrencyFormat = false

    var numberFormatter = NSNumberFormatter()
    numberFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
    var number = numberFormatter.numberFromString(text)

    if number != nil {
        isValidCurrencyFormat = true
    }

    return isValidCurrencyFormat
}

问题:除了我想要在金额之前或之后使用空格的字符串无效,并且如果此方法当前接受的小数之后有两个以上的数字时,这也有效。

目前我并不关心该方法是否基于货币类型(又名美元或英镑或其他货币)返回true或false,但我可能希望在将来使用此方法拒绝特定类型以外的货币

编辑:

这是我提出的最终代码,它正确地确定是否以正确的货币格式输入字符串并说明边缘情况。请在下面的评论中添加任何建议!

func textIsValidCurrencyFormat(text: String) -> Bool {
    var isValidCurrencyFormat = false

    var numberFormatter = NSNumberFormatter()
    numberFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
    var number = numberFormatter.numberFromString(text)

    if number != nil {
        let numberParts = text.componentsSeparatedByString(".")
        if numberParts.count == 2 {
            let decimalArray = Array(numberParts[1])
            if decimalArray.count <= 2 {
                if text == text.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) {
                    isValidCurrencyFormat = true
                }
            }
        } else {
            if text == text.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) {
                isValidCurrencyFormat = true
            }
        }

    }

    return isValidCurrencyFormat
}

2 个答案:

答案 0 :(得分:0)

这是怎么回事?如果精度大于美分,则返回false

if Double(number!) * 100 != floor(Double(number!) * 100) {
    isValidCurrencyFormat = false
}

如果之前或之后有空格,请返回false

if text != text.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) {
    isValidCurrencyFormat = false
}

所以把它们放在一起:

func textIsValidCurrencyFormat(text: String) -> Bool {
    var isValidCurrencyFormat = false

    var numberFormatter = NSNumberFormatter()
    numberFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
    var number = numberFormatter.numberFromString(text)

    if number != nil {
        isValidCurrencyFormat = true
        if Double(number!) * 100 != floor(Double(number!) * 100) {
            isValidCurrencyFormat = false # or just return false here
        }
    }

    if text != text.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) {
        isValidCurrencyFormat = false # or just return false here
    }

    return isValidCurrencyFormat
}

答案 1 :(得分:0)

我绝对采取另一种方法。我创建了一个正则表达式并将其与您的货币字符串匹配,如下所示:

func textIsValidCurrencyFormat(text: String) -> Bool {

    if text =~ "^(\$?\d{1,3}(,?\d{3})?(\.\d\d?)?|\(\$?\d{1,3}(,?\d{3})?(\.\d\d?)?\))$" {
        return true
      }

    return false
}

我认为正则表达式适用于美元,但我认为您可以修改它以使用您需要的任何货币。