我正在编写一种算法来验证 Swift 3 中的 IBAN(国际银行帐号),但无法计算其中一个验证。
示例 IBAN - BE68539007547034
这里是要验证的规则-
- 输入数字的长度应为 16。
- 前 2 个字符是国家代码(不是数字)。
- 最后 14 位是数字。
- 最后 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/