AS3 – Validar NIF, CIF y NIE

Publicado por Iván Gajate el 17 de febrero de 2011 en AS3, Tutoriales

Hoy me ha tocado validar un DNI y un CIF (de empresa) y no ha sido tan fácil como pensaba. Tras mucho buscar he encontrado esta clase en Xavirobot que funciona a las mil maravillas, gracias Javi 😉

Tiene 4 métodos:

  • isNie
  • isCif
  • isNif
  • testAll

Se puede validar cada tipo de documento por separado, o sin especificar de qué tipo es con el método testAll. Me ha parecido muy ingenioso el devolver un número positivo o negativo si es válido o no, así basta con consultar si es mayor que 0 para saber si es un documento correcto, sea del tipo que sea 😀

Lo único que no me ha gustado es cómo hay que usar los métodos. Personalmente los validadores siempre los hago con métodos estáticos, así son muy fáciles de usar:

TestDni.isNif("12345678Z") // true
TestDni.testAll("12345678Z") // 3 (NIF)

Así que he modificado algo su clase haciendo los métodos estáticos. La dejo aquí como referencia, la original la puedes ver en Xavirobot:

/* www.xavirobot.com validador CIF NIF NIE
Esta clase dipone de 4 metodos isNif, isNie, isCif y test
Los tres primeros los podemos utilizar de forma independiente
por ejemplo si tenemos un campo de entrada donde sabemos que solo se podra introducir el nif
entonces utilizaremos el metodo isNif --> var resultado = nameclass.isNif("aqui el Nif");
y lo mismo para los otros 2 metodos, estos 3 metodos nos devolveran true o false
Si por el contrario tenemos que validar los 3 tipos de DNI utilizaremos el 4 metodo test.
resultado = nameclass.testAll("doc dni?");
este metodo nos dira que tipo de dni es y devolvera los siguientes valores
1 o -1      1 = NIE correcto, -1 = NIE incorrecto.
2 o -2      2 = CIF correcto, -2 = CIF incorrecto.
3 o -3      3 = NIF correcto, -3 = NIF incorrecto.
0           0 = Si devuelve cero entocnes no es un documento valido de ningun tipo
lo unico que hace el metodo test es averiguar que tipo de dni se a introducido y dependiendo de eso
llama a uno de los otros 3 metodos
Uso de la clase en el stage
import TestDni;
TestDni.isNie("Aqui doc NIE"); //Return true o false
TestDni.isCif("Aqui doc CIF"); //Return true o false
TestDni.isNif("Aqui doc NIF"); //Return true o false
TestDni.testAll("Aqui doc NIF, CIF O NIE"); //Return 1 o -1, 2 o -2, 3 o -3, y 0
*/
package {

    public class TestDni {

        //--------------------------------------------------------------------------
        public static function isNif(a:String):Boolean {
            var dni:String=a.toUpperCase();
            var numero:Number=Number(dni.substr(0,dni.length-1));
            var let:String=dni.substr(dni.length-1,1);
            let=let.toUpperCase();
            numero=numero%23;
            var letra:String='TRWAGMYFPDXBNJZSQVHLCKET';
            var lletra:String=letra.charAt(numero);
            return (lletra == let);//devuelve true o false
        }//End isNif

        //--------------------------------------------------------------------------
        public static function isNie(a:String):Boolean {
            var dni:String=a.toUpperCase();
            var pre:String=dni.substr(0,1);
            var prev:String="0";
            if (pre=="X") {
                prev="0";
            } else if (pre == "Y") {
                prev="1";
            } else if (pre == "Z") {
                prev="2";
            }
            var numero:String=prev+dni.substr(1,dni.length-1);
            return isNif(numero);//una vez tratamos el NIE lo comprovamos como un NIF
        }//End isNie

        //--------------------------------------------------------------------------
        public static function isCif(cif:String):Boolean {
            var pares:Number=0;
            var impares:Number=0;
            var suma:String;
            var ultima:String;
            var unumero:Number;
            var uletra:Array=new Array("J","A","B","C","D","E","F","G","H","I");
            var xxx:String;
            var texto:String=cif.toUpperCase();
            var regular:RegExp=new RegExp(/^[ABCDEFGHJKLMNPQS]\d{7}[0-9,A-J]$/g);
            if (! regular.exec(texto)) {
                return false;
            }
            ultima=texto.substr(8,1);
            for (var cont:Number = 1; cont <7; cont ++) {
                xxx = (2 * parseInt(texto.substr(cont++,1))).toString() + "0";
                impares+=parseInt(xxx.substr(0,1))+parseInt(xxx.substr(1,1));
                pares+=parseInt(texto.substr(cont,1));
            }
            xxx = (2 * parseInt(texto.substr(cont,1))).toString() + "0";
            impares+=parseInt(xxx.substr(0,1))+parseInt(xxx.substr(1,1));
            suma = (pares + impares).toString();
            unumero=parseInt(suma.substr(suma.length-1,1));
            unumero = (10 - unumero);
            if (unumero==10) {
                unumero=0;
            }
            if ((ultima == String(unumero)) || (ultima == uletra[unumero])) {
                return true;
            } else {
                return false;
            }
        }//End isCif

        //--------------------------------------------------------------------------
        public static function testAll(dni:String):Number {
            var cadena:String=dni.toUpperCase();//convertimos a mayusculas
            var pre:String=cadena.substr(0,1);//extraemos el primer digito o letra
            if (pre=="X"||pre=="Y"||pre=="Z") {//Si el primer digito es igual a X,Y o Z entonces es un NIE
                if (isNie(dni)) {//llamamos a la funcion testNIE(); pasandole por parametro el dni. Devolvera true o false
                    return 1;//Si es true devolvemos 1, 1 = NIE correcto. 
                } else {
                    return -1;//Si es false devolvemos -1, -1 = NIE incorrecto.
                }
            } else {//Si no es un NIE comprovamos si es un CIF
                var letrasCIF:RegExp=new RegExp(/[ABCDEFGHJKLMNPQRSUVW]/);//Estan son las letras por la que empieza un CIF
                if (letrasCIF.test(pre)) {//Si la primera letra de la cadena coincide con alguna del patron letrasCIF entonces es un CIF
                    if (isCif(dni)) {//llamamos a la funcion testCIF(); pasandole por parametro el dni. Devolvera true o false
                        return 2;//Si es true devolvemos 2, 2 = CIF correcto. 
                    } else {
                        return -2;//Si es false devolvemos -2, -2 = CIF incorrecto.
                    }
                } else {//Si no es un CIF comprovamos si es un NIF
                    var numerosNIF:RegExp=new RegExp(/[1234567890]/);
                    if (numerosNIF.test(pre)) {//Si el primer digito de la cadena coincide con el patron numerosNIF entonces es un NIF
                        if (isNif(dni)) {//llamamos a la funcion testNIF(); pasandole por parametro el dni. Devolvera true o false
                            return 3;//Si es true devolvemos 3, 3 = NIF correcto. 
                        } else {
                            return -3;//Si es false devolvemos -3, -3 = NIF incorrecto.
                        }
                    } else {//Si tampoco es un NIF entonces no es un dni valido de ningun tipo 
                        //si no es ninguno devolvemos 0
                        return 0;
                    }
                }
            }
        }//End function test
    }//End class
}//End package

 

18 comentarios para “AS3 – Validar NIF, CIF y NIE”

  1. Encantando Javi!

  2. Hola ivan he pasado para saludarte 🙂
    Veo que tienes un blog muy interesante si no te importa voy a estrenar los enlaces de interes con la dirección de tu blog
    Saludos