Buenas, puedes guiarte por el siguiente ejemplo de cómo se calcula la letra del dni usando JavaScript:
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 esta:
La letra 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
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.
Salu2