如何将条形码解码为 ISBN?
How to decode a barcode into ISBN?
对于这个具有说明性目的的问题,我将编写 Javascript 代码,但这只是一个说明,问题与语言无关。
我需要编写一个函数,将条形码文本(不是图像)作为输入,returns 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 的情况下表示 11-base 中的数字 10。
据我了解这些文章:
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 值。我的推理是否正确?
第二部分是人类可读的价格(来自this slide):
因此,您考虑的第一部分是有道理的,51050
不是条形码的一部分!
商品价格为10.50$
.
对于这个具有说明性目的的问题,我将编写 Javascript 代码,但这只是一个说明,问题与语言无关。
我需要编写一个函数,将条形码文本(不是图像)作为输入,returns 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 的情况下表示 11-base 中的数字 10。
据我了解这些文章:
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 值。我的推理是否正确?
第二部分是人类可读的价格(来自this slide):
因此,您考虑的第一部分是有道理的,51050
不是条形码的一部分!
商品价格为10.50$
.