国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

PHP中校驗ISBN碼的函數(shù)詳解

2024-05-04 21:48:42
字體:
供稿:網(wǎng)友

本文章來講述一下關于在ISBN校驗方法,有需要的同學可參考一下,考慮到一個嚴謹?shù)膱D書管理程序要考慮到多方面的問題,因為10位ISBN碼的圖書還是有巨大的存世量的,所以要校驗圖書ISBN碼的正確性,就必須同時考慮10位和13位的情況.

平常我們能夠見到的ISBN碼有10位和13位兩種,其中10位的ISBN自2007年1月起已經(jīng)停止使用,目前新出版的圖書ISBN碼都是13位.

考慮到一個嚴謹?shù)膱D書管理程序要考慮到多方面的問題,因為10位ISBN碼的圖書還是有巨大的存世量的,所以要校驗圖書ISBN碼的正確性,就必須同時考慮10位和13位的情況.

從維基百科可以了解到ISBN碼最后一位是校驗碼,其實要想校驗ISBN碼的正確,就是通過計算ISBN的校驗碼,看是否與最后一位吻合,這里所說的校驗也只是校驗ISBN在構(gòu)成上是否合法,而不會校驗是否為已發(fā)行圖書的ISBN,下面是維基百科提供的ISBN碼校驗算法.

校驗碼的計算方法(10碼)

假設某國際標準書號號碼前9位是:7-309-04547 

計算加權(quán)和S:S = 7×10+3×9+0×8+9×7+0×6+4×5+5×4+4×3+7×2 = 226 

計算S÷11的余數(shù)M:M = 226 mod 11 = 6 

計算11 – M 的差N:N = 11 − 6 = 5 

如果N = 10,校驗碼是字母"X" 

如果N = 11,校驗碼是數(shù)字"0" 

如果N為其他數(shù)字,校驗碼是數(shù)字N 

所以,本書的校驗碼是5;如果用戶提供的ISBN碼是7-309-04547-6,那么校驗失敗.

校驗碼的計算方法(13碼)

假設某國際標準書號號碼前12位是:978-986-181-728 

計算加權(quán)和S:S = (9×1)+(7×3)+(8×1)+(9×3)+(8×1)+(6×3)+(1×1)+(8×3)+(1×1)+(7×3)+(2×1)+(8×3) = 164 

計算S÷10的余數(shù)M:M = 164 mod 10 = 4 

計算10 – M 的差N:N = 10 − 4 = 6 

如果N = 10,校驗碼是數(shù)字"0" ,如果N為其他數(shù)字,校驗碼是數(shù)字N,所以,本書的校驗碼是6,完整的國際標準書號號碼為 ISBN 978-986-181-728-6.

好了,背景知識介紹到這,下面我寫的ISBN碼校驗函數(shù)(php版),需要的話可以直接使用,代碼如下:

  1. /** 
  2.  * 名稱: PHP校驗ISBN碼的函數(shù) 
  3.  * 作者:露兜 
  4.  * 最后修改:2010年09月26日 
  5.  */ 
  6.  
  7. function isbn_sum($isbn$len
  8. /*  
  9.  * 該函數(shù)用于計算ISBN加權(quán)和  
  10.  * 參數(shù)說明: 
  11.  *   $isbn : isbn碼 
  12.  *   $len  : isbn碼長度 
  13.  */ 
  14.     $sum = 0; 
  15.      
  16.     if ($len == 10) 
  17.     { 
  18.         for ($i = 0; $i < $len-1; $i++) 
  19.         { 
  20.             $sum = $sum + (int)$isbn[$i] * ($len - $i); 
  21.         } 
  22.     } 
  23.     elseif ($len == 13) 
  24.     { 
  25.         for ($i = 0; $i < $len-1; $i++) 
  26.         { 
  27.             if ($i % 2 == 0) 
  28.                 $sum = $sum + (int)$isbn[$i]; 
  29.             else 
  30.                 $sum = $sum + (int)$isbn[$i] * 3; 
  31.         } 
  32.     } 
  33.     return $sum
  34.  
  35. function isbn_compute($isbn$len
  36. /*  
  37. * 該函數(shù)用于計算ISBN末位校驗碼 
  38. * 參數(shù)說明: 
  39. *   $isbn : isbn碼 
  40. *   $len  : isbn碼長度 
  41. */ 
  42.  
  43.     if ($len == 10) 
  44.     { 
  45.         $digit = 11 - isbn_sum($isbn$len) % 11; 
  46.  
  47.         if ($digit == 10) 
  48.             $rc = 'X'
  49.         else if ($digit == 11) 
  50.             $rc = '0'
  51.         else 
  52.             $rc = (string)$digit
  53.     } 
  54.     else if($len == 13) 
  55.     { 
  56.         $digit = 10 - isbn_sum($isbn$len) % 10; 
  57.  
  58.         if ($digit == 10) 
  59.             $rc = '0'
  60.         else 
  61.             $rc = (string)$digit
  62.     } 
  63.  
  64.     return $rc
  65.  
  66. function is_isbn($isbn
  67. /*  
  68.  * 該函數(shù)用于判斷是否為ISBN號  
  69.  * 參數(shù)說明: 
  70.  *    $isbn : isbn碼 
  71.  */ 
  72.     $len = strlen($isbn); 
  73.  
  74.     if ($len!=10 && $len!=13) 
  75.         return 0; 
  76.  
  77.     $rc = isbn_compute($isbn$len); 
  78.     //開源代碼Vevb.com 
  79.     if ($isbn[$len-1] != $rc)   /* ISBN尾數(shù)與計算出來的校驗碼不符 */ 
  80.         return 0; 
  81.     else 
  82.         return 1; 

函數(shù)寫好后,就可以直接調(diào)用了,下面是調(diào)用示例,代碼如下:

<?php echo is_isbn('9787507421781') ? '校驗通過':'校驗失敗'; ?>

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 安多县| 全椒县| 安顺市| 仪征市| 莱西市| 探索| 延长县| 平乡县| 察隅县| 宜宾县| 辽宁省| 盖州市| 大石桥市| 荥经县| 禹州市| 齐齐哈尔市| 湛江市| 明光市| 普宁市| 揭西县| 满洲里市| 乾安县| 安丘市| 金塔县| 呼伦贝尔市| 湟源县| 巴楚县| 棋牌| 双城市| 嵊泗县| 湖南省| 惠来县| 信丰县| 无锡市| 鞍山市| 金坛市| 霸州市| 高邮市| 鄂尔多斯市| 淮南市| 岑巩县|