Hace poco me surgió tener que hacer un campo para validar los documentos de identidad DNI, me puse a buscar información sobre las reglas y encontré un ejemplo hecho en javascript que al parecer funcionaba correctamente, es sorprendente la compatibilidad de javascript y actionscript prácticamente no tuve que hacer nada para adaptarlo a as3.0 solo declarar el tipo de variable y listo.
A parte de esto cree otra función para saber el tipo de DNI introducido y adapte la función encargada de comprobar el CIF para la nueva letra J introducida en el 2010 para los CIF, la única dificultad que me encontré es que me tuve que mirar así por encima las expresiones regulares para entender un poco el funcionamiento y ciertamente las expresiones regulares me dan pánico aunque si sabes utilizarlas es una herramienta muy útil.
Abajo encontrareis 2 ejemplos y sus respectivas descargas, el primero utilizando las funciones directamente en el stage de flash y el segundo utilizando una clase que cree para tenerlo todo un poco mas recogidito.
Ejemplo de uso mediante funciones en el stage
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
function testNIF(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 } //trace("DNI -> "+testDNI("numero")); function testNIE(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 testNIF(numero);//una vez tratamos el NIE lo comprovamos como un NIF } //trace("NIE -> "+ testNIE("numero")); function testCIF(cif:String) { 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)) { trace("1"); 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; } } //trace("CIF -> "+ testCIF("numero")); /*Arriba tenemos 3 funciones por separado encargadas de validar independientemente el cif,nif y nie Teniendo en cuenta que un NIE solo puede empezar por las siguientes letras X,Y,Z y un nif por numeros y los CIF por cualquiera de las siguientes A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W sabiendo esto vamos a crear una funcion para averiguar que tipo de dni se a introducido si es un nif llamaremos a testNIF(); si es un cif llamaremos a testCIF(); si es un nie llamaremos a testNIE(); */ function isNifCifNie(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 (testNIE(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 (testCIF(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 (testNIF(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; } } } } //trace("CIF -> "+ isNifCifNie("numero")); validar.addEventListener(MouseEvent.CLICK, onValidar); function onValidar(e:Event):void { var res:Number=isNifCifNie(dniInput.text); if (res==1) { resultado.text="Es un NIE y es correcto"; } if (res==-1) { resultado.text="Es un NIE y es incorrecto"; } if (res==2) { resultado.text="Es un CIF y es correcto"; } if (res==-2) { resultado.text="Es un CIF y es incorrecto"; } if (res==3) { resultado.text="Es un NIF y es correcto"; } if (res==-3) { resultado.text="Es un NIF y es incorrecto"; } if (res==0) { resultado.text="No es un dni valido"; } } |
Ejemplo
[download id=»22″ format=»2″]
Ejemplo utilizando la clase
clase TestDni.as
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
/* jvm.bricobit.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; var dni:TestDni = new TestDni(); dni.isNie("Aqui doc NIE"); //Return true o false dni.isCif("Aqui doc CIF"); //Return true o false dni.isNif("Aqui doc NIF"); //Return true o false dni.testAll("Aqui doc NIF, CIF O NIE"); //Return 1 o -1, 2 o -2, 3 o -3, y 0 */ package { public class TestDni { //-------------------------------------------------------------------------- public 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 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 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 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 |
Uso desde el stage
1 2 3 4 5 6 |
import TestDni; var dni:TestDni = new TestDni(); dni.isNie("Aqui doc NIE"); //Return true o false dni.isCif("Aqui doc CIF"); //Return true o false dni.isNif("Aqui doc NIF"); //Return true o false dni.testAll("Aqui doc NIF, CIF O NIE"); //Return 1 o -1, 2 o -2, 3 o -3, y 0 |
Ejemplo
[download id=»23″ format=»2″]
10 comments on “AS3 – Útiles – Validación / Validar NIF, CIF, NIE con”
Hola Javier
me ha venido de perlas esta clase, no encontraba nada que funcionase bien en todos los casos 😀
Solo un comentario, si las funciones las haces estáticas, te evitarás tener que instanciar la clase, y es mucho mas cómodo: TestDni.testAll(«1111111A»)
¿te importa si te referencio en mi blog? Es una clase que debería popularizarse.
Hola Iván me alegro que te sirva la clase y te agradezco el comentario.
Respecto a convertir las funciones en estaticas tienes razon, tomare nota.
Sobre referenciarlo no me importa al contrario me hace ilusión, siempre y cuando me pidan permiso.
Si quieres puedes dejar un enlace aqui a tu blog para que pueda visitarlo
Saludos
Gracias Javier
ahora pongo el post 😉
http://www.yporqueno.es
El validador de CIF me acaba de salvar la tarde 🙂
¡Mil gracias!
Me alegro 🙂
Nano gracias por la ayuda andaba to loco buscando algo así.
CIF R4700228B da incorrecto
CIF V28306678 da incorrecto
Yo lo he comprobado con otras páginas y son correctos, pero esta función las da como mal
R4700228B da incorrecto
V28306678 da incorrecto