DEV Community

Innovation Of The Pear
Innovation Of The Pear

Posted on AI-assisted

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 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
Enter fullscreen mode Exit fullscreen mode

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'
Enter fullscreen mode Exit fullscreen mode

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'
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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.

Top comments (0)