ios - IBAN 验证器 Swift

标签 ios swift iban

我正在编写一种算法来验证 Swift 3 中的 IBAN(国际银行帐号),但无法计算其中一个验证。

示例 IBAN - BE68539007547034

这里是要验证的规则-

  1. 输入数字的长度应为 16。
  2. 前 2 个字符是国家代码(不是数字)。
  3. 最后 14 位是数字。
  4. 最后 2 个字符是前 12 个数字字符的模 97 结果。

虽然 #1 - #3 很清楚,但我需要澄清 #4。如果有人以前做过这件事并且知道这件事,请告诉我。

最佳答案

如果您遵循 wikipedia 上的算法,验证算法会相当简单:

extension String {
    private func mod97() -> Int {
        let symbols: [Character] = Array(self)
        let swapped = symbols.dropFirst(4) + symbols.prefix(4)

        let mod: Int = swapped.reduce(0) { (previousMod, char) in
            let value = Int(String(char), radix: 36)! // "0" => 0, "A" => 10, "Z" => 35
            let factor = value < 10 ? 10 : 100          
            return (factor * previousMod + value) % 97
        }

        return mod
    }    

    func passesMod97Check() -> Bool {
        guard self.characters.count >= 4 else {
            return false
        }

        let uppercase = self.uppercased()

        guard uppercase.range(of: "^[0-9A-Z]*$", options: .regularExpression) != nil else {
            return false
        }

        return (uppercase.mod97() == 1)
    }
}

用法:

let iban = "XX0000000..."
let valid = iban.passesMod97Check()

如果要验证特定国家/地区的格式,只需修改正则表达式,例如

"^[A-Z]{2}[0-9]{14}$"

或直接

"^BE\\d{14}$"

关于ios - IBAN 验证器 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43803956/

相关文章:

ios - 无法使用类型为 'decode' 的参数列表调用 '(T, from: Data)'

MySQL自动计算IBAN bigint溢出

javascript - 正则表达式来屏蔽 IBAN

ios - 在 Swift 中使用类别并在不同的类中使用它们

ios - 在 iOS 中未显示隐私警报的本地化文本

ios - 如何使用 Alamofire 制定一个良好的模式来控制多个请求依赖关系?比如request2需要request1的响应

ios - SQLite3 获取行 ID 时出现问题

ios - Xcode 9 中的 CIContext 内存泄漏问题在 swift 中

xslt - 使用 XSLT 2.0 验证 IBAN?

ios - 断断续续的分页 UIScrollView 体验