@singuerinc

2011-06-17

Validar DNI/NIE/NIF de España

javascript, actionscript3, validators, dni, nie, nif

Hola, otra Class de validación, en este caso para validar un DNI español.
Realicé una classe porque quería tener un set de funciones, y poder diferenciar si se trata de un nif o un nie.

La clase acepta "nies" que empiecen con letra o número y puede ser en mayúsculas o minúsculas, por ejemplo, es lo mismo Y9145668P que 19145668p.

Aquí el código:

package net.singuerinc.labs.utils.validators {
    public class SpainDNIValidator {

        private var _dni:String;

        private var _isNie:Boolean;
        private var _isNif:Boolean;
        private var _valid:Boolean;

        private const validChars:String = 'TRWAGMYFPDXBNJZSQVHLCKET';
        private const nifRexp:RegExp = /^[0-9]{8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/i;
        private const nieRexp:RegExp = /^[XYZ]{1}[0-9]{7}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/i;

        public function SpainDNIValidator(dni:String) {
            _dni = dni;
            _valid = _validate();
        }

        public function isValid():Boolean {
            return _valid;
        }

        public function isNIF():Boolean {
            return _isNif;
        }

        public function isNIE():Boolean {
            return _isNie;
        }

        private function _validate():Boolean {

            var val:String = _dni.toString().toUpperCase();

            if (!nifRexp.test(val) && !nieRexp.test(val)) {
                return false;
            }

            var nie:String = val;
            nie = nie.replace(/^[X]/, '0');
            nie = nie.replace(/^[Y]/, '1');
            nie = nie.replace(/^[Z]/, '2');

            var dniLetter:String = val.substr(-1);
            var charIndex:int = int(nie.substr(, 8)) % 23;

            if (validChars.charAt(charIndex) == dniLetter) {

                _isNif = nifRexp.test(val);
                _isNie = nieRexp.test(val);

                return true;
            }

            return false;
        }
    }
}

Y algunos ejemplos:

var val1:SpainDNIValidator = new SpainDNIValidator('x9464186p');
val1.isValid(); //true
val1.isNIF(); //false
val1.isNIE(); //true

var val2:SpainDNIValidator = new SpainDNIValidator('12345678Z');
val2.isValid(); //true
val2.isNIF(); //true
val2.isNIE(); //false

Puedes encontrar la última versión en github.