功能说明
IBAN 等编号使用 ISO 7064 mod-97 校验,直接对长数字做 Number 运算会超出安全整数范围。该实现逐位取模,只用 0 到 96 的余数,因此可以处理任意长度的数字字符串。它适合校验位计算、编号自检和导入数据的前置验证。
关键代码
mod97 先删除空格和连字符并校验只含数字,然后对每个字符执行余数乘 10 加当前数字再取模 97。computeCheckDigits 在基数后补两个零求余,用 98 减余数得到两位校验位。validateCheckDigits 对整个字符串求余并判断是否为 1。
let remainder = 0;
for (const char of digits) {
remainder = (remainder * 10 + Number(char)) % 97;
}
return remainder;
使用注意
校验位计算假设基数是纯数字;真实 IBAN 需要先把字母转换为 10 到 35 的数字并调整顺序。该函数不验证国家代码、长度或银行账号结构。空格与连字符会被忽略,其他字符抛 TypeError。校验位始终补足两位,因此小于 10 时会有前导零。
验证方式
断言 computeCheckDigits(“123456”) 返回两位数字,拼接后 validateCheckDigits 为 true。改动任意一位后校验失败。带空格与连字符的输入结果与纯数字一致。包含字母抛 TypeError。超长数字字符串不会因为精度问题产生错误余数。