You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 01:45:43