如何在Swift中实现IBAN转换的Modulo 97计算?
在Swift中实现大数字的Modulo 97运算(适配IBAN生成)
嘿,刚好做过IBAN相关的工具,来给你分享一下Swift里怎么处理这个大数字取模的问题!
首先得说明:IBAN生成用到的校验和字符串通常非常长,远远超出了Swift标准整数类型(比如Int64)的存储范围,所以不能直接转成整数再取模,得用逐位计算余数的方法——原理是利用模运算的性质:(a * 10 + b) % 97 = [(a % 97) * 10 + b] % 97,这样每次只需要处理一位数字,累积计算余数就不会有溢出问题。
具体实现代码
这里有个专门的函数来处理这个逻辑:
func calculateMod97(for numberString: String) -> Int { var remainder = 0 for character in numberString { // 把字符转成对应的数字 guard let digit = Int(String(character)) else { // 如果输入的不是纯数字,这里可以根据需求抛出错误或者返回默认值 fatalError("输入的字符串包含非数字字符,请检查!") } // 按照模运算的性质更新余数 remainder = (remainder * 10 + digit) % 97 } return remainder }
用你的示例测试
拿你给的校验和字符串 "700901001234567890131400" 来测试:
let checkSum = "700901001234567890131400" let moduloResult = calculateMod97(for: checkSum) print(moduloResult) // 输出 8,和你PHP里用bcmod得到的结果一致
结合IBAN生成的后续步骤
得到模97的结果后,IBAN的校验位计算是:
- 用
98 - 模运算结果得到最终的校验值 - 如果这个值小于10,需要在前面补0(比如结果是8的话,就变成
"08") - 把这个校验位插入到IBAN的对应位置,就生成了正确的IBAN
这个方法完全适配Swift的各种平台(包括iPhone),而且性能很好,哪怕是超长的数字字符串也能快速计算。
内容的提问来源于stack exchange,提问作者Enes
相关产品推荐
相关产品推荐

