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

来源:互联网 发布:黑大网络教学平台 编辑:程序博客网 时间:2024/05/16 08:09
由 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代替。


<?phpclass Ezphp_Tool_ISBN{    public static function to10($isbn)    {        $isbn = str_replace('-', '', $isbn);        if(!preg_match('/^\d+x?$/i', $isbn)){            return null;        }                if(strlen($isbn) == 10){            return $isbn;        }                $sum = 0;        $num = substr($isbn, 3, 9);        for($i = 10, $p = 0; $i > 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;    }    }


原创粉丝点击