1
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
}
118

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118
