8

我尝试使用 Java 将 ISBN10 代码转换为 ISBN13 数字。从 。在isbn-13.info 上,我找到了转换它们的方法。

示例:0-123456-47-9

  • 以“978”前缀开头</li>
  • 使用 ISBN 的前九个数字字符(包括破折号)978-0-123456-47-
  • 使用“Mod 10 算法”978-0-123456-47-2 计算 EAN 校验位

使用它,我创建了一个 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 代码9513218589978951321858没有支票号码的 ISBN13),它返回 5 作为支票号码。如果我使用ISBN 官方网站上的转换器计算它,我得到 4 作为校验和。出于某种原因,新代码中的数字总和比应有的小一。

我已经为此奋斗了很长时间,我相信我已经开始盲目:我只是找不到我做错了什么。有人可以帮忙吗?

4

4 回答 4

6

干得好

    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 项目中复制粘贴它

于 2015-04-05T08:01:38.233 回答
3

在里面

for(int i = 0; i < isbn13.length(); i++) { sum += Character.getNumericValue(isbn13.charAt(i)); }

您正在将 ISBN 中的所有数字相加,包括加倍的数字。

例子:

数字 7 -> 双 = 14

你在总和上加上 14。应该是

数字 7 -> double = 14 -> 大于 9?是的,所以 1+4 = 5

你应该加5。

于 2013-06-14T12:59:37.310 回答
1

您可以使用 Apache commons-validator 库为您执行此操作。请参阅ISBNValidator::convertToISBN13方法。

import org.apache.commons.validator.routines.ISBNValidator;

String isbn13 = ISBNValidator.getInstance().convertToISBN13("9513218589");
于 2020-09-23T22:20:26.007 回答
-1

这真的很容易。请看我的 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;
} 
于 2018-08-14T21:29:15.607 回答