【问题标题】:Validate if a String is in currency format验证字符串是否为货币格式
【发布时间】:2015-05-14 18:33:31
【问题描述】:

我正在尝试快速创建一个方法,该方法接受一个字符串并返回一个布尔值。如果字符串的货币格式正确,我想返回 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
}

问题:除了我还想使金额前后有空格的字符串无效以及此方法当前接受的小数点后有两个以上的数字之外,此方法有效。

目前我不在乎该方法是否根据货币类型(也称为美元或英镑或其他货币)返回真或假,但我可能希望将来也使用它来拒绝特定类型以外的货币.

编辑:

这是我想出的最终代码,它可以正确确定字符串是否以正确的货币格式输入并考虑到边缘情况。请在下面的 cmets 中添加任何建议!

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
}

【问题讨论】:

标签: ios swift currency string-interpolation


【解决方案1】:

这是怎么回事?如果精度大于分,则返回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
}

【讨论】:

  • 第一个 if 语句测量精度的能力存在一个问题。它承认不接受 215.001 美元,但仍将接受不应接受的 215.000 美元。我已经找到了一种方法,很快就会上传我的新解决方案。
【解决方案2】:

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

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
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多