我尝试使用Java将ISBN10代码转换为ISBN13代码。来自。在isbn-13.info我找到了转换它们的方法。
示例:0-123456-47-9
- 以“978”前缀开头
- 使用ISBN的前九个数字字符(包括破折号)978-0-123456-47 -
- 使用“Mod 10算法”计算EAN校验位978-0-123456-47-2
使用它我创建了一个Java程序来进行转换。
public class ISBNConverter {
public static void main(String[] args) {
String isbn10 = "9513218589";
String isbn13 = "";
int sum = 0;
int checkNumber = 0;
int multiplier = 2;
String code = "978" + isbn10.substring(0, isbn10.length() - 1);
for(int i = code.length() - 1; i >= 0; i--) {
int num = Character.getNumericValue(code.charAt(i));
isbn13 += String.valueOf(num * multiplier);
multiplier = (multiplier == 2) ? 1 : 2;
}
for(int i = 0; i < isbn13.length(); i++) {
sum += Character.getNumericValue(isbn13.charAt(i));
}
while(sum % 10 != 0) {
sum++;
checkNumber++;
}
System.out.println(checkNumber);
}
}
对于示例ISBN10代码9513218589
(978951321858
ISBN13而没有支票号码),它返回5作为支票号码。如果我使用ISBN's official site上的转换器计算它,我得到4作为校验和。出于某种原因,新代码中的数字总和比应该的数字少一个。
我已经和它斗争了很长时间,我相信我已经开始失明了:我找不到我做错了什么。有人可以帮忙吗?
答案 0 :(得分:5)
你去吧
public static String ISBN10toISBN13( String ISBN10 ) {
String ISBN13 = ISBN10;
ISBN13 = "978" + ISBN13.substring(0,9);
//if (LOG_D) Log.d(TAG, "ISBN13 without sum" + ISBN13);
int d;
int sum = 0;
for (int i = 0; i < ISBN13.length(); i++) {
d = ((i % 2 == 0) ? 1 : 3);
sum += ((((int) ISBN13.charAt(i)) - 48) * d);
//if (LOG_D) Log.d(TAG, "adding " + ISBN13.charAt(i) + "x" + d + "=" + ((((int) ISBN13.charAt(i)) - 48) * d));
}
sum = 10 - (sum % 10);
ISBN13 += sum;
return ISBN13;
}
请原谅他们之间的日志行,我正在复制从我正在处理的android项目中粘贴它
答案 1 :(得分:3)
在
中for(int i = 0; i&lt; isbn13.length(); i ++){ sum + = Character.getNumericValue(isbn13.charAt(i)); }
您正在添加ISBN中的所有数字,包括加倍的数字。
示例:
数字7 - &gt; double = 14
你在总和上加14。应该是
数字7 - &gt; double = 14 - &gt;大于9?是的,所以1 + 4 = 5
你应该加5。
答案 2 :(得分:0)
这真的很容易。 请看我的JavaScript示例以了解转换的逻辑:
function isbn13to10(isbn13) {
var digits = [];
var sum = 0; var chk_tmp, chk_digit;
digits = (isbn13 + "").substr(3,9).split("") ;
for(var i = 0; i < 9; i++) {
sum += digits[i] * (10 - i);
}
chk_tmp = 11 - (sum % 11);
if (chk_tmp == 10) {
chk_digit = 'x';
} else if (chk_tmp == 11) {
chk_digit = 0;
} else {
chk_digit = chk_tmp;
}
digits.push(chk_digit);
return digits.join("");
}
function isbn10to13(isbn10){
var sum = (isbn10 + "").charAt(9);
var mltp = 0;
var total = 0;
if (sum == "X") { sum = 10; }
isbn10 = "978"+isbn10.substring(0,9);
for (i=0; i<12; i++) {
mltp = (i % 2) == 0 ? 1 : 3;
total = total+(isbn10.charAt(i)*mltp);
}
sum = (10 - (total % 10)) % 10;
return isbn10+sum;
}
答案 3 :(得分:0)
您可以使用Apache commons-validator库为您执行此操作。请参阅ISBNValidator::convertToISBN13方法。
import org.apache.commons.validator.routines.ISBNValidator;
String isbn13 = ISBNValidator.getInstance().convertToISBN13("9513218589");