Validar el formato de un C.I.F. pasado

 
Esta función recibe un texto y verifica si el formato de este corresponde con el de un C.I.F. (Código de Identificación Fiscal) valido, devuelve true si es valido y false si no lo es.

El formato de un CIF esta compuesto de 9 dígitos.

El primero es una letra que informa sobre que tipo de sociedad es, sus posibles valores pueden ser:

ASociedad Anónima
BSociedad de responsabilidad Limitada
CSociedad colectiva
DSociedad comanditaria
EComunidad de bienes
FSociedad cooperativa
GAsociación
HComunidad de propietarios
KFormato antiguo
LFormato antiguo
MFormato antiguo
NFormato antiguo
PCorporación local
QOrganismo autónomo
SOrgano de la administración


A continuación vienen 7 números y un último dígito de control que puede ser o bien un número, o bien una letra de las siguientes: A, B, C, D, E, F, G, H, I ó J. Este dígito tiene un valor dependiendo de los 7 números anteriores. Para saber su valor, debemos hacer estas comprobaciones:

  1. Sumar los números de las posiciones pares
  2. multiplicar cada número de las posiciones impares por 2 y en caso de que el número resultante tenga dos dígitos sumar estos entre si, por ejemplo si es 8, 8 * 2 = 16, 1 + 6 = 7
  3. Sumar todos los resultados de esta operación de los números de las posiciones impares
  4. Sumar los resultados de los números impares con los pares y coger de esta suma sólo el último dígito, por ejemplo si la suma ha dado 26, se cogería 6
  5. restar a 10 este número, por ejemplo 10 - 6 = 4. Este último número sería el que nos diría el valor del último dígito, en este ejemplo, el último dígito podría ser o bien este número o bien la letra correspondiente, así la 'A' corresponde al número '1', la 'B' al '2', y así sucesivamente. La 'J' corresponde al número '0'

Así con un CIF de ejemplo (A2345678C) inventado, vamos a hacer todos los pasos para ver si es correcto:

  1. 3 + 5 + 7 = 15
  2. 2 * 2 = 4
    4 * 2 = 8
    6 * 2 = 12 - 1 + 2 = 3
    8 * 2 = 16 - 1 + 6 = 7
  3. 4 + 8 + 3 + 7 = 22
  4. 15 + 22 = 37 (Cogemos '7')
  5. 10 - 7 = 3 (Por lo tanto también valdría la letra 'C')

Si pasáramos este CIF a la función nos devolvería true, ya que el formato del CIF pasado es correcto, lo que no quiere decir que este CIF exista.

Lo primero que hace el código es pasar el "CIF" a mayúsculas, por lo que aceptaría minúsculas, si no quisiéramos tener esta flexibilidad, deberíamos comentar esta línea (texto = texto.toUpperCase();).

Depués comprueba con una expresión regular que el formato sea como se ha dicho anteriormente. Si no fuera correcto, saldría devolviendo false, en caso contrario realiza todas las comprobaciones del último dígito que hemos comentado anteriormente.

En esta función se repiten mucho los llamamientos a las funciones "toString" y "parseInt" que lo que hacen es pasar los datos a texto y a número respectivamente, esto lo hacemos en el caso de "toString" para poder coger últimos dígitos, partir un número, etc. El "parseInt" lo hacemos para poder hacer las operaciones.

Una línea que puede ser difícil de entender es esta:
xxx = (2 * parseInt(texto.substr(cont++,1))).toString() + 0;

Lo que hace es multiplicar el número impar por dos, a continuación lo pasa a string y le añade un '0', esto lo hace por si la multiplicación no da 2 dígitos que no haga cosas inesperadas, ya que la siguiente línea sumaría el número mas 0, si esto no estuviese sumaría el número mas 'Nan'. El 'cont++' hace que el contador se incremente al finalizar la ejecución de esta línea, lo que haría que este se sitúe en los números pares, por lo que cada vez que se pasa por el bucle el contador se ha incrementado dos veces.

Al final comprueba que concuerda el último dígito con el número resultante de todas estas operaciones, o en su defecto con la letra correspondiente al número.


En el HEAD:
<script language="javascript">
//Su explorador no soporta java o lo tiene deshabilitado; esta pagina necesita javascript para funcionar correctamente<!--
//Copyright © McAnam.com
    function validarCIF(texto){
        
        var pares = 0;
        var impares = 0;
        var suma;
        var ultima;
        var unumero;
        var uletra = new Array("J", "A", "B", "C", "D", "E", "F", "G", "H", "I");
        var xxx;
        
        texto = texto.toUpperCase();
        
        var regular = new RegExp(/^[ABCDEFGHKLMNPQS]\d\d\d\d\d\d\d[0-9,A-J]$/g);
           if (!regular.exec(texto)) return false;
               
           ultima = texto.substr(8,1);

           for (var cont = 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).toString();
           if(unumero == 10) unumero = 0;
           
           if ((ultima == unumero) ||  (ultima == uletra[unumero]))
               return true;
           else
               return false;

    }
//-->        
</script>

En el BODY:
Introduzca el C.I.F. de su empresa:<br>
<input type="text" name="cif" id="cif"><br>
<input type="button" value="aceptar" onclick="alert('El resultado de la validción del nif es :\n' + validarCIF(document.getElementById('cif').value))">

Ejemplo:

Links relacionados:
Comprobar el formato de la dirección de correo con JavaScript
Encontrar repetición de caracteres en una cadena


Para cualquier duda, consulta, sugerencia, opinión, colaboración, etc; no dude en ponerse en contacto con nosotros

Copyright © 2002-2017 [McAnam]. Reservados todos los derechos.
www.mcanam.com