El dígito de control del ISBN en JavaScript (y el error que no detecta)
Si alguna vez validaste un ISBN, sabes que el último dígito no es decorativo: es un dígito de control calculado con los anteriores. Aquí van las dos funciones completas, un ejemplo con números reales y un caso que el ISB
Si alguna vez validaste un ISBN, sabes que el último dígito no es decorativo: es un dígito de control calculado con los anteriores. Aquí van las dos funciones completas, un ejemplo con números reales y un caso que el ISBN-13 deja pasar sin quejarse.
ISBN-13
Se multiplican los 12 primeros dígitos alternando los pesos 1 y 3, se suman, y el control es lo que falta para llegar al siguiente múltiplo de 10.
function control13(doce) {
let suma = 0;
for (let i = 0; i < 12; i++) suma += Number(doce[i]) * (i % 2 ? 3 : 1);
return (10 - (suma % 10)) % 10;
}
control13('978030640615'); // 7
Con 978030640615 la suma es 93, el siguiente múltiplo de 10 es 100, y 100 - 93 = 7.
ISBN-10
Aquí los pesos van de 10 a 2 y el módulo es 11. Si el resultado es 10, se escribe la letra X.
function control10(nueve) {
let suma = 0;
for (let i = 0; i < 9; i++) suma += Number(nueve[i]) * (10 - i);
const c = (11 - (suma % 11)) % 11;
return c === 10 ? 'X' : String(c);
}
control10('030640615'); // '2'
De ISBN-10 a ISBN-13
Se antepone 978 a los 9 primeros dígitos y se recalcula el control:
function a13(isbn10) {
const base = '978' + isbn10.slice(0, 9);
return base + control13(base);
}
a13('0306406152'); // '9780306406157'
Así, 0-306-40615-2 y 978-0-306-40615-7 son el mismo libro.
El error que se cuela
El control detecta cualquier dígito mal escrito. Con dos dígitos vecinos intercambiados, el ISBN-10 también avisa siempre, pero el ISBN-13 no:
control13('978030640615'); // 7
control13('978030640165'); // 7 (el 6 y el 1 cambiados de sitio)
Los dos números pasan la validación, aunque el segundo es otro. La razón es aritmética: al intercambiar dos vecinos a y b, la suma cambia en (b - a) * (peso1 - peso2), que en ISBN-13 es 2 * (b - a). Eso es múltiplo de 10 cuando a y b se diferencian en 5 (0 y 5, 1 y 6, 2 y 7, 3 y 8, 4 y 9). En ISBN-10 los pesos vecinos se diferencian en 1 y el módulo 11 es primo, así que el cambio nunca llega a ser múltiplo de 11 si los dígitos son distintos.
Conclusión práctica: que un ISBN-13 sea válido no garantiza que sea el que querías. Compara también el título que devuelve la búsqueda.
Probarlo sin escribir código
En MyTools hay un comprobador que muestra las multiplicaciones dígito por dígito, con ejemplos para el caso correcto, el de un dígito mal y el de dos dígitos cambiados, además del equivalente de 10 a 13: https://mytools.lat/blog/que-es-el-isbn-como-buscar-un-libro/
Transparencia: este artículo lo publica el equipo de MyTools, el sitio del comprobador.
Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.