
2023年5月23日發(作者:道歉信模板)public class Test {
public static void main(String[] args) {
n("9787302155638 " + SBN("9787302155638"));
n("7564105607 " + SBN("7564105607"));
n("730213880X " + SBN("730213880X"));
n("7302138800 " + SBN("7302138800"));
n("979 " + SBN("979"));
try {
n(SBN("977"));
}catch(Exception e) {
n("977 " + sage());
}
try {
n(SBN("123456545"));
}catch(Exception e) {
n("123456545 " + sage());
}
}
}
public final class ISBN {
/**
* 根據輸入的ISBN號,檢驗ISBN的有效性。依據 GB/T 5795-2006 和 ISO 2108:2005 ISBN
* 10位標準和13位標準實現(13位標準自2007年1月1日開始實行,在此之前采用10位標準)。
*
* @param String isbn:需要進行校驗的ISBN字符串
* @return true:所輸入的ISBN校驗正確;
fal:所輸入的ISBN校驗錯誤
*/
public static boolean checkISBN(String isbn) {
int count = 0;
int checkBitInt = 0;
// 將ISBN數據全取大寫字母
//isbn = rCa();
char[] cs = Array();
switch (()) {
ca 10:
// ****************************************************************
// 當ISBN為10位時,進行的校驗,用于2007年1月1日前的出版物
// 數據格式:從左至右前9位為ISBN數據,第10位為校驗位
// 校驗方法:
// (1) 從左至右將前9位數據從10開始至2進行編號,作為位權
// (2) 將9位數據與各位位權進行加權,并求其9位和(稱為加權和,記作M)
// (3) 第10位校驗位計算方法,校驗位為C:
// M + C ≡ 0 (mod 11)
// C為10時,記作“X”
// ****************************************************************
// 取出前9位數字進行加權和計算
for (int i = 0; i < 9; i++) {
// 若前9位數據中有非數字字符,則拋出異常
if (cs[i] < '0' || cs[i] > '9') {
throw new ISBNFormatException("ISBN " + isbn +
" 第 " + (i + 1) + " 位中出現非法字符 " + cs[i]);
}
int c = cs[i] - '0';
// 求加權和
count += c * (10 - i);
}
// 取出校驗位數據0~9和X符合校驗字符要求
if (cs[9] >= '0' && cs[9] <= '9') {
checkBitInt = cs[9] - '0';
} el if (cs[9] == 'X' || cs[9] == 'x') {
// 校驗位中的“X”表示數據“10”
checkBitInt = 10;
} el {
// 非0~9或X時拋出異常
throw new ISBNFormatException("ISBN " + isbn +
" 第 10 位中出現非法字符 " + cs[9]);
}
// 進行校驗
if ((count + checkBitInt) % 11 == 0) {
return true; // 校驗成功
} el {
return fal; // 校驗失敗
}
ca 13:
// ****************************************************************
// 當ISBN為13位時,進行的校驗,用于2007年1月1日后的出版物
// 數據格式:從左至右前12位為ISBN數據,第13位為校驗位
// 校驗方法:
// (1) 從左至右將前12位數的取其奇位數和和偶位數和
// (2) 將偶位數和乘3,并其與奇位數和的和,得加權和
// (3) 第13位校驗位計算方法,校驗位為C:
// M + C ≡ 0 (mod 10)
// ****************************************************************
// ISBN為13位數據時,前3位目前只能是“978”(已實行)或“979”(暫未實行)
if (!With("978") && !With("979")) {
throw new ISBNFormatException("ISBN-13 格式不符合標準");
}
// 取出前12位數字進行加權和計算
int countEven = 0;
int countOdd = 0;
for (int i = 0; i < 12; i++) {
int c = cs[i] - '0';
// 若前12位數據中有非數字字符,則拋出異常
if (c < 0 || c > 9) {
throw new ISBNFormatException("ISBN " + isbn +
" 第 " + (i + 1) + " 位中出現非法字符 " + cs[i]);
}
// 分別計算奇位數和偶位數的和
if ((i & 0x1) == 0) {
countOdd += c;
} el {
countEven += c;
}
}
// 求加權和
count = countOdd + (countEven * 3);
// 取出校驗位數據
if (cs[12] < '0' || cs[12] > '9') {
// 校驗位為非0~9字符時,拋出異常
throw new ISBNFormatException("ISBN " + isbn
+ " 第 13 位中出現非法字符 " + cs[12]);
}
checkBitInt = cs[12] - '0';
// 進行校驗
if ((count + checkBitInt) % 10 == 0) {
return true; // 校驗成功
} el {
return
fal; // 校驗失敗
}
default:
// ISBN為非10位或13位時拋出異常
throw new ISBNFormatException("ISBN 格式不符合標準");
}
}
}
public class ISBNFormatException extends RuntimeException {
private static final long rialVersionUID = 1L;
public ISBNFormatException() {
super("ISBN Error ...");
}
public ISBNFormatException(String arg0) {
super(arg0);
}
}
轉載須注明A