775ac7b58c
you must login with an BTP account in order to see the app
51 lines
No EOL
1.1 KiB
JavaScript
51 lines
No EOL
1.1 KiB
JavaScript
import assertString from './util/assertString';
|
|
var isbn10Maybe = /^(?:[0-9]{9}X|[0-9]{10})$/;
|
|
var isbn13Maybe = /^(?:[0-9]{13})$/;
|
|
var factor = [1, 3];
|
|
export default function isISBN(str) {
|
|
var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
|
assertString(str);
|
|
version = String(version);
|
|
|
|
if (!version) {
|
|
return isISBN(str, 10) || isISBN(str, 13);
|
|
}
|
|
|
|
var sanitized = str.replace(/[\s-]+/g, '');
|
|
var checksum = 0;
|
|
var i;
|
|
|
|
if (version === '10') {
|
|
if (!isbn10Maybe.test(sanitized)) {
|
|
return false;
|
|
}
|
|
|
|
for (i = 0; i < 9; i++) {
|
|
checksum += (i + 1) * sanitized.charAt(i);
|
|
}
|
|
|
|
if (sanitized.charAt(9) === 'X') {
|
|
checksum += 10 * 10;
|
|
} else {
|
|
checksum += 10 * sanitized.charAt(9);
|
|
}
|
|
|
|
if (checksum % 11 === 0) {
|
|
return !!sanitized;
|
|
}
|
|
} else if (version === '13') {
|
|
if (!isbn13Maybe.test(sanitized)) {
|
|
return false;
|
|
}
|
|
|
|
for (i = 0; i < 12; i++) {
|
|
checksum += factor[i % 2] * sanitized.charAt(i);
|
|
}
|
|
|
|
if (sanitized.charAt(12) - (10 - checksum % 10) % 10 === 0) {
|
|
return !!sanitized;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
} |