Как декодировать штрих-код в ISBN?

Для этого вопроса с иллюстративной целью я напишу код 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). «X» в случае ISBN10 представляет число 10 в 11-основании.

Насколько я понимаю эти статьи:

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

штрих-коды будут содержать цифры ISBN, кроме последней цифры, пример, который дает первая статья:

ISBN = 09767736X

Штрих-код = 9780976773665

Что меня смущает, так это число 51050 на этой картинке.

введите здесь описание изображения

Интересно, является ли это частью штрих-кода или нет. Если мы считаем, что это не штрих-код, то преобразование штрих-кода в 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. Я прав в своих рассуждениях?


person Lajos Arpad    schedule 12.02.2019    source источник


Ответы (1)


Вторая часть — это удобочитаемая цена (из этого слайда):

введите здесь описание изображения

Следовательно, первая часть вашего рассмотрения имеет смысл, и 51050 не является частью штрих-кода! Цена товара 10.50$.

person OmG    schedule 12.02.2019
comment
@LajosArpad с удовольствием. да. - person OmG; 13.02.2019