2007年ISBN从10位升级为13位,新增前缀“978”或“979”以兼容欧洲商品编码(EAN),并与全球贸易条形码系统统一。这就涉及到了ISBN-13与ISBN-10的相互转化问题。下面用PHP展示转化逻辑:
/**
* 将ISBN-13转换为ISBN-10
*
* @param string $isbn 输入的ISBN-13字符串
* @return string 返回ISBN-10字符串,如果输入无效则返回空字符串
*/
function to10($isbn)
{
$isbn = str_replace('-', '', $isbn);
if(!preg_match('/^\d+x?$/i', $isbn)) return '';
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';
elseif($check == 11) $check = '0';
return $num . $check;
}
/**
* 将ISBN-10转换为ISBN-13
*
* @param string $isbn 输入的ISBN-10字符串
* @return string 返回ISBN-13字符串,如果输入无效则返回空字符串
*/
function to13($isbn)
{
$isbn = str_replace('-', '', $isbn);
if(!preg_match('/^\d+x?$/i', $isbn)) return '';
if(strlen($isbn) == 13) return $isbn;
$sum = 0;
$num = '978' . substr($isbn, 0, 9);
for($i = 0; $i < 12; $i++){
$n = intval($num[$i]);
if(($i + 1) % 2 == 0){
$sum += $n * 3;
}else{
$sum += $n;
}
}
$m = $sum % 10;
$check = 10 - $m;
return $num . $check;
}


© 2015-2025 杭州极速互联科技有限公司 版权所有 浙ICP备17047587号-4 浙公网安备33010502005096 增值电信业务经营许可证:浙B2-20190875