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 阅读(1387) 评论(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存储过程与函数

搜索

  •  

最新评论

阅读排行榜

评论排行榜