> Manuales > Taller de Javascript

Cómo calcular la letra del DNI con Javascript. Cómo validar un DNI introducido por el usuario para saber si es correcto, verificando su formato y que la letra del NIF corresponde con la que se espera.

Calcular la letra del DNI en Javascript y validar un NIF

Los números de identidad personales (DNI, documento nacional de identidad), por lo menos en España, tienen una parte numérica y otra parte de texto. El número es variable para cada español y la letra se calcula con una fórmula a partir del número.

En este taller de Javascript vamos a ver una función para calcular la letra de un DNI, que podemos usar para realizar cualquier comprobación que queramos sobre si un DNI es correcto o no.

En españa el DNI es la parte numérica. Más bien cuando nos referimos al DNI con la letra le llamamos NIF.

Por qué necesito calcular la letra de un DNI

Muchos datos que son sensibles y propensos a fallos usan lo que se llaman dígitos de control para verificar que se han introducido correctamente. Es el caso de las cuentas bancarias o el caso que nos ocupa, los DNI.

En el DNI, la letra que acompaña al número hace esa función de dígito de control. Mediante el análisis de la parte numérica del DNI se puede calcular la letra y ella nos facilita comprobar si un DNI te lo han dictado bien. Aunque no podamos saber a ciencia cierta si es el DNI de la persona, al menos sí se puede afirmar que el DNI introducido en un formulario se ajusta a lo que podría ser un DNI válido.

Por tanto, no se trata de calcular la letra del DNI para permitir que el usuario escriba menos!!! En realidad le tienes que hacer escribir el DNI completo (lo que se llama el NIF) y una vez analizada la parte numérica ver si corresponde con la letra calculada, en cuyo caso daríamos por hecho que no se han equivocado al introducir el DNI.

Función Javascript que calcula la letra del DNI

Esta función Javascript recibe el número del DNI, pero solamente la parte numérica. Entonces hace el cálculo de la letra correspondiente y devuelve el valor de la letra.

function calcularLetraDni(dni) {
  let cadena = "TRWAGMYFPDXBNJZSQVHLCKET";
  dni = parseInt(dni);
  let posicion = dni % (cadena.length - 1);
  return cadena[posicion];
}

Como puedes comprobar, la letra del DNI se calcula a partir de una cadena con letras desordenadas. Esa cadena es la clave para saber si el DNI es correcto. Luego se toma el valor numérico del DNI como si fuera un número enteror. Entonces se obtiene el resto de la división por el número de caracteres de la cadena inicial menos uno. Así obtenemos una posición de la cadena de caracteres desordenados. Luego se devuelve la letra que hay en esa posición.

Ejemplo de uso de la función que calcula la letra del DNI

Ahora vamos a ver un ejemplo de uso de esta función. Vamos a pedir al usuario que coloque el DNI sin la letra y, al pulsar un botón realizaremos el cálculo de la letra para obtener el NIF.

Ten en cuenta que este no es el uso típico que podrías hace de esta función, ya que si el DNI está mal y pertenece a otra persona lo que estarás haciendo es calcular la letra que corresponde como si fuese verdadero. Es decir, no estarias usando la letra del NIF para lo que se ha pensado que sirva.

Para ello vamos a tener un formulario con un campo de texto y un botón. Al hacer clic en el botón se usará lo que se haya escrito en el campo de texto para añadir al DNI su letra calculada.

Vamos a ver el ejemplo de la página web completa:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Calcular la letra del DNI</title>
</head>
<body>
  
  <form name="formulario">
    Escribe tu DNI sin la letra:<br>
    <input type="text" name="dni" maxlenght="11" size="11" id="dni">
    <input type="button" value="Haz clic para calcular la letra" id="calcular">
  </form>

  <script>
    function calcularLetraDni(dni) {
      let cadena = "TRWAGMYFPDXBNJZSQVHLCKET";
      dni = parseInt(dni);
      let posicion = dni % (cadena.length - 1);
      return cadena[posicion];
    }

    document.getElementById('calcular').addEventListener('click', function() {
      let dni = document.getElementById('dni');
      let letra = calcularLetraDni(dni.value);
      dni.value += letra;
    })    
  </script>
</body>
</html>

No tiene mucho misterio. Simplemente se hace un manejador de evento "click" sobre el botón. En el manejador se calcula la letra enviando lo que hay escrito en el campo de texto y finalmente se introduce la letra en el campo de texto.

Este ejemplo, como digo, te puede ayudar a comprobar si la función de cálculo de la letra es correcta. Luego, el ejercicio para validar un DNI sería algo distinto.

Validar un DNI o NIF

Para completar el artículo vamos a ver cómo podríamos hacer de manera sencilla la validación de un NIF, es decir, el DNI con la letra. Esto incluye dos pasos:

La parte que nos falta es la de comprobar que el formato del NIF es correcto, al menos sintacticamente. Esto lo hacemos con esta función:

function formatoNifValido(dni) {
  const regex = /^\d{1,8}[A-Za-z]$/;
  return regex.test(dni);
}

Esta expresión regular comprueba estas cosas:

Y ahora nos queda verificar el NIF escrito, descomponer las partes numéricas y la letra y comprobar que la letra se ajusta. La parte compleja, que es calcular la letra del DNI ya la tenemos hecha, por lo que vamos a ver directamente un código completo.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Calcular la letra del DNI</title>
</head>
<body>
  
  <form>
    Escribe tu NIF:
    <input type="text" name="nif" id="nif">
    <button id="validar">Validar</button>
  </form>

  <script>

    function calcularLetraDni(dni) {
      let cadena = "TRWAGMYFPDXBNJZSQVHLCKET";
      dni = parseInt(dni);
      let posicion = dni % (cadena.length - 1);
      return cadena[posicion];
    }

    function formatoNifValido(dni) {
      const regex = /^\d{8}[A-Za-z]$/;
      return regex.test(dni);
    }

    document.getElementById('validar').addEventListener('click', function() {
      let nif = document.getElementById('nif').value;
      if(formatoNifValido(nif)) {
        let letraCalculada = calcularLetraDni(nif.substring(0, nif.length - 1));
        let letraEscrita = nif[nif.length - 1];
        if(letraCalculada.toLowerCase() == letraEscrita.toLowerCase()) {
          alert('El NIF es correcto');
        } else {
          alert('El NIF escrito NO es correcto');
        }
      } else {
        alert('El NIF no tiene el formato válido')
      }
    });

  </script>
</body>
</html>

Espero que lo hayas podido entender todo correctamente y que puedas validar tus DNI o mejor dicho, validar el NIF (con la letra) correctamente.

Manuel Estévez Simonet

Desarrollador Web.

Manual