检验ISBN的有效性
public 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}