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.
7º 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
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
sabes si se le puede aplicar una hoja de estilos a este javascript?
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.
Cierto, en la revisión a ECMAScript 6 convirtieron let en palabra reservada. Tendré que corregir el artículo.
Se puede aplicar un css a este javascript?
Muchas Gracias
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
}
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
}
Muchas gracias por el código!
Pingback: Use a Javascript function in an SQL query using BigQuery | DSNOTEBOOK