Validar un DNI con Javascript

Una de las primeras cosas que aprendí a hacer en C era a validar un DNI. Es un ejercicio clásico para todo estudiante de informática en España. Luego, desarrollando alguna web me he encontrado con la cuestión de hacerlo en javascript, el algún formulario web. La verdad, no es muy difícil, pero aquí os dejo una muestra del código explicado. Por si no lo sabéis, la letra del DNI está relacionada con el número. Se calcula cogiendo todas las letras, excepto la Ñ, la I y la O porque pueden inducir a errores, en un orden concreto (que no es el orden alfabético lógico, sino este ‘TRWAGMYFPDXBNJZSQVHLCKET’) y seleccionando la que coincide en la posición igual al resto de dividir el número del dni entre 23.

function nif(dni) {
  var numero
  var letr
  var letra
  var expresion_regular_dni

  expresion_regular_dni = /^\d{8}[a-zA-Z]$/;

  if(expresion_regular_dni.test (dni) == true){
     numero = dni.substr(0,dni.length-1);
     letr = dni.substr(dni.length-1,1);
     numero = numero % 23;
     letra='TRWAGMYFPDXBNJZSQVHLCKET';
     letra=letra.substring(numero,numero+1);
    if (letra!=letr.toUpperCase()) {
       alert('Dni erroneo, la letra del NIF no se corresponde');
     }else{
       alert('Dni correcto');
     }
  }else{
     alert('Dni erroneo, formato no válido');
   }
}

La explicación es rápida y simple:

1º La función recibe una variable con el DNI como string.

2º Tras definir las variables creamos una expresión regular que valida si el DNI está compuesto por 8 letras y un caracter, ya sea en mayúscula o minúscula.

3º Extraemos el número del DNI (es decir, un substring con la longitud del DNI entero menos una letra) y la letra (un substring de un solo caracter que empieza en la posición de la longitud total menos uno).

4º Hacemos la operación de módulo entre el número extraído y 23, reutilizando la variable número para almacenar el resultado. Hacemos esto porque lo necesitamos para calcular si la letra del NIF es válida.

5º Creamos una string con las letras del abecedario ( sin la ñ) en ese orden que se pone arriba.

6º Cogemos un substring de un solo caracter de esa cadena de letras que empiece en la posición marcada por el número que conseguimos en el punto cuatro al hacer la operación de módulo, reutilizando la variable módulo.

Comprobamos que la letra cogida de la cadena de letras sea igual a la letra cogida del DNI. Si se cumple la condición sacamos un aviso de que es correcto y si no sacamos el de error.

Véis, muy sencillo. Eso sí, ese código tal cual es para introducir un dni con la letra pegada al número. Si queréis poner un separador entre estos, acordaos de modificar en consecuencia todas las funciones.

//Editamos ya que desde la aparición de ECMAScript 6 en 2014 let se ha convertido en una palabra reservada y no puede ser usada como nombre de variable

Anuncios

7 comentarios en “Validar un DNI con Javascript

  1. Gorka

    Un poco viejo el post, pero por si acaso te corrijo un bug:

    Por un lado en la expresion regular le indicas que te admita mayusculas y minuscular.
    Por otro lado en la linea 15 realizas la comprobación de si la letra es mayuscula.

    Esa linea deberia ser así:
    if (letra!=let.toUpperCase()) {

    Un saludo

  2. Rob

    Yo he tenido problemas con la variable let de la línea 3.
    Parece ser una palabra reservada en javascript así que recomiendo cambiarla (a cualquier cosa, como letraDni).

    Saludos y gracias por el código.

  3. Muchas gracias por compartirlo.

    Lo he simplificado con la función:

    function dniValido(dni){ // Retorna: true | false
    if (/^\d{8}[a-zA-Z]$/.test(dni)) {
    var n = dni.substr(0,8);
    var c = dni.substr(8,1);
    return (c.toUpperCase() == ‘TRWAGMYFPDXBNJZSQVHLCKET’.charAt(n%23)); // DNI correcto ?
    }
    return false; // DNI incorrecto
    }

  4. pacofdez

    Muchas gracias por compartirlo.

    Lo he simplificado con la función:

    function dniValido(dni){ // Retorna: true | false
    if (/^\d{8}[a-zA-Z]$/.test(dni)) {
    var n = dni.substr(0,8);
    var c = dni.substr(8,1);
    return (c.toUpperCase() == ‘TRWAGMYFPDXBNJZSQVHLCKET’.charAt(n%23)); // DNI correcto ?
    }
    return false; // DNI incorrecto
    }

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s