php 10位isbn 13位isbn 的相互转换

由 2007 年 1 月 1 日 起 , 国 际 标 准 书 号 ﹝ 下 简称书号﹞的格 式 会 由 10 位 修 订 为 13 位 。 是 次 修 订 的 主 要 目 的 ,是增加国际标 准 书 号 系 统 的 容 量 , 以 及 令 国 际 标 准书号能够 与应 用于 其 他 货 品 和 供 应 链 的 13 位 国 际 货 品编码 (EAN-13) 完 全相 容 。
ISBN13位转化ISBN号10位的方法步骤
1:去掉条码号的前3位和最后1位,即为10位isbn号的前9位     
2:10位isbn号的最后1位为校验码,校验码的计算方法:isbn号的10位按位序分别乘以10、9、8、7、6、5、4、3、2,积的和应是11的倍数(有余数)。
如:13位ISBN “9787810872102”转化为10位ISBN,去掉前三位978和最后一位2,得到一个9位数781087210,然后10*7+9*8+8*1+7*0+6*8+5*7+4*2+3*1+2*0=244,   
244/11的余数为2,11-2=9,所以校验码为9。9即使最后一位,因此13位ISBN “9787810872102”转化的10位ISBN为“7810872109”

当余数为0时,校验码为 0,余数为1时,补数为10,此时用符号X代替。


 1; $i--, $p++){
            $sum += $i * intval($num[$p]);
        }
        
        $m = $sum % 11;
        
        $check = 11 - $m;
        
        if($check == 10){
            $check = 'x';
        }
        
        if($check == 11){
            $check = '0';
        }
        
        return $num . $check;
    }
   
    public static function to13($isbn)
    {
        $isbn = str_replace('-', '', $isbn);
        if(!preg_match('/^\d+x?$/i', $isbn)){
            return null;
        }
        
        if(strlen($isbn) == 13){
            return $isbn;
        }
        
        $sum = 0;
        $num = '978' . substr($isbn, 0, 9);
        
        for($i = 0; $i < 12; $i++){
            $n = $num[$i];
            if(($i + 1) % 2 == 0){
                $sum += $n * 3;
            }else{
                $sum += $n;
            }
        }
        
        $m = $sum % 10;
        $check = 10 - $m;
        
        return $num . $check;
    }
    
}




你可能感兴趣的:(php)