1.827 views Validación / Validar NIF, CIF, NIE con actionscript /AS3.0
Interfaces Añade un comentarioHace 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
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
Descargar ejemplo nifcifnie.rar -
- Descargado (260) veces.
.
Ejemplo utilizando la clase
clase TestDni.as
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
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
.
Descargar ejemplo nifcifnieClass.rar -
- Descargado (215) veces.
.
febrero 16th, 2011 a las 16:02
Hola Javier
me ha venido de perlas esta clase, no encontraba nada que funcionase bien en todos los casos :D
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.
febrero 17th, 2011 a las 7:19
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
febrero 17th, 2011 a las 21:14
Gracias Javier
ahora pongo el post ;)
http://www.yporqueno.es
febrero 17th, 2011 a las 21:47
[...] (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 [...]