vlinDone
BlogJava
首页
新文章
新随笔
聚合
管理
posts - 33, comments - 17, trackbacks - 0
根据输入的ISBN号,检验ISBN的有效性
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
posted on 2008-07-24 08:24
scea2009
阅读(1395)
评论(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 |
悟道
很好 相当好 真的很好
回复
更多评论
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
SQL语句效率--摘录
常用数据表结构修改sql语句(oracle)
时间计算工具类
数据库连接
根据输入的ISBN号,检验ISBN的有效性
字符串类(java2000_net写)
<
2008年7月
>
日
一
二
三
四
五
六
29
30
1
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
1
2
3
4
5
6
7
8
9
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(1)
给我留言
查看公开留言
查看私人留言
随笔分类
个人
网摘(6)
随笔档案
2008年12月 (2)
2008年8月 (1)
2008年7月 (24)
2008年6月 (1)
2008年5月 (4)
PL/SQL存储过程与函数
搜索
最新评论
1. re: 18位号码身份证校验码的计算公式[未登录]
1@邱丽娟
--李杰
2. re: 生成 JSON 字符串的工具
ddddddddd
--hls
3. re: 18位号码身份证校验码的计算公式
340621198706139338
--陆树军
4. re: 生成 JSON 字符串的工具
12121
--11112dacda
5. re: 18位号码身份证校验码的计算公式
wozhidao
--lixziyu
阅读排行榜
1. 18位号码身份证校验码的计算公式(25058)
2. 生成 JSON 字符串的工具 (4954)
3. s:select(2860)
4. 关于 Calendar.getInstance()(1408)
5. 根据输入的ISBN号,检验ISBN的有效性(1395)
评论排行榜
1. 18位号码身份证校验码的计算公式(10)
2. 根据输入的ISBN号,检验ISBN的有效性(4)
3. 生成 JSON 字符串的工具 (2)
4. 时间计算工具类(1)
5. 数据库连接(0)