posts - 33,  comments - 17,  trackbacks - 0
            1public final class ISBN {
            2
            3    /**
            4     * 根據輸入的ISBN號,檢驗ISBN的有效性。依據 GB/T 5795-2006 和 ISO 2108:2005 ISBN
            5     * 10位標準和13位標準實現(13位標準自2007年1月1日開始實行,在此之前采用10位標準)。
            6      * 
            7     * @param String isbn:需要進行校驗的ISBN字符串
            8      * @return true:所輸入的ISBN校驗正確;<br/> false:所輸入的ISBN校驗錯誤
            9      */

           10    public static boolean checkISBN(String isbn) {
           11
           12        int count = 0;
           13        int checkBitInt = 0;
           14
           15        // 將ISBN數據全取大寫字母
           16         //isbn = isbn.toUpperCase();
           17        
           18        char[] cs = isbn.toCharArray();        
           19        switch (isbn.length()) {
           20        case 10:
           21            // ****************************************************************
           22            // 當ISBN為10位時,進行的校驗,用于2007年1月1日前的出版物
           23              // 數據格式:從左至右前9位為ISBN數據,第10位為校驗位
           24              // 校驗方法:
           25              // (1) 從左至右將前9位數據從10開始至2進行編號,作為位權
           26              // (2) 將9位數據與各位位權進行加權,并求其9位和(稱為加權和,記作M)
           27              // (3) 第10位校驗位計算方法,校驗位為C:
           28              //         M + C ≡ 0 (mod 11)
           29            //  C為10時,記作“X”
           30              // ****************************************************************
           31
           32            // 取出前9位數字進行加權和計算            
           33              for (int i = 0; i < 9; i++{
           34                // 若前9位數據中有非數字字符,則拋出異常
           35                  if (cs[i] < '0' || cs[i] > '9'{
           36                    throw new ISBNFormatException("ISBN " + isbn +
           37                            " 第 " + (i + 1+ " 位中出現非法字符 " + cs[i]);
           38                }

           39                
           40                int c = cs[i] - '0';
           41                // 求加權和
           42                  count += c * (10 - i);
           43            }

           44
           45            // 取出校驗位數據0~9和X符合校驗字符要求
           46              if (cs[9>= '0' && cs[9<= '9'{
           47                checkBitInt = cs[9- '0';
           48            }
           else if (cs[9== 'X' || cs[9== 'x'{
           49                // 校驗位中的“X”表示數據“10”
           50                  checkBitInt = 10;
           51            }
           else {
           52                // 非0~9或X時拋出異常
           53                  throw new ISBNFormatException("ISBN " + isbn + 
           54                        " 第 10 位中出現非法字符 " + cs[9]);
           55            }

           56
           57            // 進行校驗
           58              if ((count + checkBitInt) % 11 == 0{
           59                return true// 校驗成功
           60              }
           else {
           61                return false// 校驗失敗
           62            }

           63        case 13:
           64            // ****************************************************************
           65            // 當ISBN為13位時,進行的校驗,用于2007年1月1日后的出版物
           66              // 數據格式:從左至右前12位為ISBN數據,第13位為校驗位
           67              // 校驗方法:
           68              // (1) 從左至右將前12位數的取其奇位數和和偶位數和
           69              // (2) 將偶位數和乘3,并其與奇位數和的和,得加權和
           70              // (3) 第13位校驗位計算方法,校驗位為C:
           71              //         M + C ≡ 0 (mod 10)
           72            // ****************************************************************
           73
           74            // ISBN為13位數據時,前3位目前只能是“978”(已實行)或“979”(暫未實行)
           75              if (!isbn.startsWith("978"&& !isbn.startsWith("979")) {
           76                throw new ISBNFormatException("ISBN-13 格式不符合標準");
           77            }

           78            // 取出前12位數字進行加權和計算
           79              int countEven = 0;
           80            int countOdd = 0;
           81            for (int i = 0; i < 12; i++{
           82                int c = cs[i] - '0';
           83                // 若前12位數據中有非數字字符,則拋出異常
           84                  if (c < 0 || c > 9{
           85                    throw new ISBNFormatException("ISBN " + isbn +
           86                            " 第 " + (i + 1+ " 位中出現非法字符 " + cs[i]);
           87                }

           88                // 分別計算奇位數和偶位數的和
           89                  if ((i & 0x1== 0{
           90                    countOdd += c;
           91                }
           else {
           92                    countEven += c;
           93                }

           94            }

           95            // 求加權和
           96             count = countOdd + (countEven * 3);
           97
           98            // 取出校驗位數據            
           99             if (cs[12< '0' || cs[12> '9'{
          100                // 校驗位為非0~9字符時,拋出異常
          101                  throw new ISBNFormatException("ISBN " + isbn
          102                        + " 第 13 位中出現非法字符 " + cs[12]);
          103            }

          104
          105            checkBitInt = cs[12- '0';
          106            // 進行校驗
          107             if ((count + checkBitInt) % 10 == 0{
          108                return true// 校驗成功
          109             }
           else {
          110                return false// 校驗失敗
          111             }

          112        default:
          113            // ISBN為非10位或13位時拋出異常
          114             throw new ISBNFormatException("ISBN 格式不符合標準");
          115        }

          116    }

          117}

          118
          posted on 2008-07-24 08:24 scea2009 閱讀(1411) 評論(4)  編輯  收藏 所屬分類: 網摘

          FeedBack:
          # ISBN 9978-7-80170-747-5/J·8[未登錄]
          2009-11-14 22:03 | jelly
          我想分辨書的真假。  回復  更多評論
            
          # ISBN 7-5023-4912-X
          2011-09-09 22:46 | 悟道
          好fsdfjsd的及風刀霜劍  回復  更多評論
            
          # ISBN 7-5023-4912-X
          2011-09-09 22:46 | 悟道
          很好  回復  更多評論
            
          # ISBN 7-5023-4912-X
          2011-09-09 22:46 | 悟道
          很好 相當好 真的很好  回復  更多評論
            

          <2008年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          PL/SQL存儲過程與函數

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 灵寿县| 通州区| 博野县| 图木舒克市| 公安县| 郴州市| 拜城县| 峨眉山市| 马关县| 延长县| 天柱县| 平武县| 瑞金市| 游戏| 错那县| 信阳市| 隆昌县| 株洲市| 中超| 沾益县| 晋中市| 聊城市| 棋牌| 郎溪县| 渭源县| 普兰店市| 黔江区| 湟中县| 深州市| 朝阳县| 大田县| 通山县| 屏山县| 兴海县| 左贡县| 霍林郭勒市| 环江| 富平县| 正安县| 桓台县| 新津县|