← 中文资源

简体中文版本

Mod-97 校验位计算与验证

计算 ISO 7064 mod-97 校验位并验证长数字字符串,避免超出 JavaScript 安全整数范围。

阅读英文原文

功能说明

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。超长数字字符串不会因为精度问题产生错误余数。