如何将条形码解码为ISBN?

问题描述 投票:2回答:1

对于这个具有说明性目的的问题,我将编写Javascript代码,但这只是一个例子,问题与语言无关。

我需要编写一个函数,它将条形码文本(不是图像)作为输入,并返回ISBN作为输出。 ISBN可以是10位数(旧书)或13位数(新书)。我们还知道ISBN的最后一位是校验和,如果ISBN长度为10位,则计算方式不同,如果ISBN长度为13位,则计算方式不同。

假设输入是一个字符串,我们可以验证它是否是有效的ISBN,如:

function isValidISBN10(input) {
    if (input.length !== 10) return false;
    var sum = 0;
    var p = 10;
    for (var index = 0; index < 10; index++) {
        sum += ((input[index] === 'X') ? 10 : input[index]) * (p--);
    }
    return sum % 11 === 0;
}

和ISBN13可以验证如下:

function isValidISBN13(input) {
    if (input.length !== 13) return false;
    var sum = 0;
    var p = 3;
    for (var index = 0; index < 13; index++) {
        sum += input[index] * (p = (p + 2) % 4);
    }
    return sum % 10 === 0;
}

检查有效的ISBN是:

function isValidISBN(input) {
    return isValidISBN10(input) || isValidISBN13(input);
}

我们可以看到,ISBN的最后一位是我们应该添加的数字,以确保结果可以被11(在ISBN10的情况下)和10(在ISBN13的情况下)整除。在ISBN10的情况下,'X'代表11个基数中的10个。

据我了解这些文章:

https://www.barcodefaq.com/1d/isbn/ https://isbn-information.com/isbn-barcode.html

条形码将包含ISBN的数字,除了最后一位数字,第一篇文章给出的例子

ISBN = 09767736X

条形码= 9780976773665

令我困惑的是这张照片上51050的数量

enter image description here

我想知道它是否是条形码的一部分。如果我们认为它不是条形码,那么将条形码转换为ISBN将是微不足道的:

function convertBarcodeIntoISBN(input) {
    var isbn = {isbn13: input};
    if (input.startsWith("978")) {
        var isbn10 = input.substring(3);
        var checksum = 0;
        var p = 10;
        for (var index = 0; index < 9; index++) {
            checksum += isbn10[index] * (p--);
        }
        checksum = 11 - (checksum % 11);
        if (checksum === 10) checksum = 'X';
        isbn10 += checksum;
        isbn.isbn10 = isbn10;
    }
    return isbn;
}

但是如果我们考虑将51050作为条形码的一部分,那么我们将需要从条形码中挖掘ISBN,但是,在这种情况下,我不确定我应该如何操作。我能从头脑中汲取的最好成绩是:

function getLastISBNDigit(input) {
    if ((input.length != 10) && (input.length != 13)) return;
    var is10 = (input.length === 10);
    var sum = 0;
    var p = (is10 ? 11 : 3);
    for (var index = 0; index < input.length - 1; index++) {
        sum += ((input[index] === 'X') ? 10 : input[index]) * (p = (is10 ? (p - 1) : ((p + 2) % 4)));
    }
    var moduloClass = (is10 ? 11 : 10);
    var result = (moduloClass - (sum % moduloClass)) % moduloClass;
    return ((result === 10) ? 'X' : result);
}

function getISBN(input) {
    var isbn = {};
    if (input.length > 13) return getISBN(input.substring(0, 13));
    if (input.length === 10) {
        if (isValidISBN(input)) {
            isbn.isbn10 = input;
            isbn.isbn13 = "978" + input;
            isbn.isbn13 = isbn.isbn13.substring(0, 12) + getLastISBNDigit(isbn.isbn13);
        }
    } else if (input.length === 13) {
        if (isValidISBN(input)) {
            isbn.isbn13 = input;
            if (input.startsWith("978")) {
                isbn.isbn10 = input.substring(3);
                isbn.isbn10 = isbn.isbn10.substring(0, 9) + getLastISBNDigit(isbn.isbn10);
            }
        } else if (input.startsWith("978")) {
            return getISBN(input.substring(3));
        }
    }
    return isbn;
}

这就是我认为条形码应该转换成ISBN和ISBN13值的方式。我的理由是对的吗?

algorithm barcode isbn
1个回答
3
投票

第二部分是人类可读的价格(来自this slide):

enter image description here

因此,您考虑的第一部分是有道理的,51050不是条形码的一部分!该产品的价格是10.50$

© www.soinside.com 2019 - 2024. All rights reserved.