Как декодировать штрих-код в ISBN? - PullRequest
0 голосов
/ 12 февраля 2019

Для этого вопроса с иллюстративной целью я напишу код 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 на этой картинке

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.Я прав в своих рассуждениях?

1 Ответ

0 голосов
/ 12 февраля 2019

Вторая часть - это понятная человеку цена (от этот слайд ):

enter image description here

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

...