Modulus 11自校验位生成PHP转JavaScript结果异常排查
Modulus 11自校验位生成JS实现故障排查
测试验证基准:传入参数
123240657时,正确返回结果应为1232406573,原始JS实现仅返回原输入值,不符合预期。
已知可正常运行的PHP版本实现
function GenMOD11( $base_val ) { $result = ""; $weight = array( 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7 ); $reversed_base_val = strrev( $base_val ); for ( $i = 0, $sum = 0; $i < strlen( $reversed_base_val ); $i++ ) { $sum += substr( $reversed_base_val, $i, 1 ) * $weight[ $i ]; } $remainder = $sum % 11; switch ( $remainder ) { case 0: $result = $base_val . 0; break; case 1: $result = "n/a"; break; default: $check_digit = 11 - $remainder; $result = $base_val . $check_digit; break; } return $result; }
存在问题的原始JS代码
<script type='text/javascript'> jQuery(document).ready(function($) { function GenMOD11F( base_val ) { var result = ""; var weight = [ 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7 ]; var reversed_base_val = parseInt(base_val.toString().split('').reverse().join('')); var i, sum; for ( i = 0, sum = 0; i < reversed_base_val.length; i++ ) { sum += reversed_base_val.substring(i, 1) * weight[i]; } var remainder = sum % 11; switch ( remainder) { case 0: result = base_val+0; break; case 1: result = "n/a"; break; default: var check_digit = 11 - remainder; result = base_val.check_digit; break; } return result; } }); </script>
错误点说明
- 输入值反转后错误调用
parseInt转为数字类型:数字类型无length属性、无substring方法,直接导致加权和计算循环无法执行,sum始终为0 - 字符串截取参数错误:JS中
substring方法第二个参数为结束索引,原代码传入substring(i,1),当i>0时返回空字符串,无法取到对应位置的数字字符 - 校验位拼接语法错误:JS使用
+做字符串拼接,原代码写base_val.check_digit是读取对象属性,返回undefined,无法完成拼接
修正后可正常运行的JS代码
<script type='text/javascript'> jQuery(document).ready(function($) { function GenMOD11F( base_val ) { let result = ""; const weight = [ 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7, 2, 3, 4, 5, 6, 7 ]; // 统一转字符串处理,不转数字 const baseStr = base_val.toString(); const reversed_base_val = baseStr.split('').reverse().join(''); let sum = 0; for ( let i = 0; i < reversed_base_val.length; i++ ) { // 直接按索引取字符,转数字后参与加权计算 sum += Number(reversed_base_val[i]) * weight[i]; } const remainder = sum % 11; switch (remainder) { case 0: result = baseStr + 0; break; case 1: result = "n/a"; break; default: const check_digit = 11 - remainder; // 用+号拼接校验位 result = baseStr + check_digit; break; } return result; } // 测试调用,传入123240657时输出1232406573,和PHP运行结果一致 console.log(GenMOD11F(123240657)); }); </script>
内容的提问来源于stack exchange,提问作者Michal19901
相关产品推荐
相关产品推荐

