[C#] Validación de un CIF y un NIF

Pubicado en5 comentariosCategoríasProgramación

El otro día un compañero me dijo que no podía tener un repositorio de funciones de código sin tener una entrada dedicada a las validaciones de CIF y NIF. No lo entendí muy bien, pero me vino a decir que viene siendo el «Hola mundo» para las secciones de código.

En fin, independientemente de que tenga razón o no pues he decidido poner las funciones que uso yo. Tenía una que también tiene en cuenta los NIEs (número de identificación de extranjeros) pero no la encuentro… la pondré en otro momento.

Ale, aquí os queda. Espero que os sea útil:

Validando un CIF:

/// <summary>
/// Funcion que valida un CIF
/// </summary>
/// <param name="Numero">El numero del CIF a validar</param>
/// <returns>True si el CIF es correcto</returns>
public bool Valida_CIF(string Numero)
{
     //Valida el cif actual
     string[] letrasCodigo = { "J", "A", "B", "C", "D", "E", "F", "G", "H", "I" };

     string LetraInicial = Numero[0].ToString();
     string DigitoControl = Numero[Numero.Length - 1].ToString();
     string n = Numero.ToString().Substring(1, Numero.Length - 2);
     int sumaPares = 0;
     int sumaImpares = 0;
     int sumaTotal = 0;
     int i = 0;
     bool retVal = false;

     // Recorrido por todos los dígitos del número
     // Recorrido por todos los dígitos del número
     for (i = 0; i < n.Length; i++)
     {
         int aux;
         Int32.TryParse(n[i].ToString(), out aux);

         if ((i + 1) % 2 == 0)
         {
             // Si es una posición par, se suman los dígitos
             sumaPares += aux;
         }
         else
         {
             // Si es una posición impar, se multiplican los dígitos por 2
             aux = aux * 2;

             // se suman los dígitos de la suma
             sumaImpares += SumaDigitos(aux);
         }
      }

      // Se suman los resultados de los números pares e impares
      sumaTotal += sumaPares + sumaImpares;

      // Se obtiene el dígito de las unidades
      Int32 unidades = sumaTotal % 10;

      // Si las unidades son distintas de 0, se restan de 10
      if (unidades != 0)  unidades = 10 - unidades;

      switch (LetraInicial)
      {
          // Sólo números
          case "A":
          case "B":
          case "E":
          case "H":
              retVal = DigitoControl == unidades.ToString();
              break;

          // Sólo letras
          case "K":
          case "P":
          case "Q":
          case "S":
              retVal = DigitoControl == letrasCodigo[unidades];
              break;

          default:
               retVal = (DigitoControl == unidades.ToString()) || (DigitoControl == letrasCodigo[unidades]);
               break;
      }

      return retVal;

}

private Int32 SumaDigitos(Int32 digitos)
{
    string sNumero = digitos.ToString();
    Int32 suma = 0;

    for (Int32 i = 0; i < sNumero.Length; i++)
    {
        Int32 aux;
        Int32.TryParse(sNumero[i].ToString(), out aux);
        suma += aux;
    }
    return suma;
}

Validando un NIF:

/// <summary>
/// Valida un NIF
/// </summary>
/// <param name="valor">NIF a validar</param>
/// <returns>Resultado de la validacion</returns>
public Boolean VerificarNIF(String valor)
{
     String aux = null;
     valor = valor.ToUpper();

     // ponemos la letra en mayúscula
     aux = valor.Substring(0, valor.Length - 1);
     // quitamos la letra del NIF
     if (aux.Length >= 7 && this.CadenaEsNumero(aux))
         aux = this.CalculaNIF(aux); // calculamos la letra del NIF para comparar con la que tenemos
     else
         return false;

     // comparamos las letras
     return (valor != aux);
}

/// <summary>
/// Dado un DNI obtiene la letra que le corresponde al NIF
/// </summary>
/// <param name="strA">DNI</param>
/// <returns>Letra del NIF</returns>
private String CalculaNIF(String strA)
{
    const String cCADENA = "TRWAGMYFPDXBNJZSQVHLCKE";
    const String cNUMEROS = "0123456789";

    Int32 a = 0;
    Int32 b = 0;
    Int32 c = 0;
    Int32 NIF = 0;
    StringBuilder sb = new StringBuilder();

    strA = strA.Trim();
    if (strA.Length == 0) return "";

    // Dejar sólo los números
    for (int i = 0; i <= strA.Length - 1; i++)
       if (cNUMEROS.IndexOf(strA[i]) > -1) sb.Append(strA[i]);

    strA = sb.ToString();
    a = 0;
    NIF = Convert.ToInt32(strA);
    do
    {
        b = Convert.ToInt32((NIF / 24));
        c = NIF - (24 * b);
        a = a + c;
        NIF = b;
    } while (b != 0);

    b = Convert.ToInt32((a / 23));
    c = a - (23 * b);
    return strA.ToString() + cCADENA.Substring(c, 1);
}

5 comentarios en “[C#] Validación de un CIF y un NIF”

  1. Nunca pensé que fuese a postear aqui pero he de decir que a mi tambien me ensañaron la formula para encontrar la letra correspondiente a cada DNI.

    Ahora ya veo su correpondiente codigo c…

    Creo que me sigo quedando con mi fórmula.. 😮

    s2!

  2. El cif no debe tener siempre la misma longitud?? Creo que esa comprobación no se esta haciendo. Puede ser que la suma de dígitos sea correcta y sin embargo falte un dígito y por tanto el CIF no sea correcto, no??

  3. Tienes razón, Rocío. Habría que añadir un control de la longitud total de la cadena igualmente para los casos de CIF y NIE, pero no para el DNI ya que todavía circulan por ahí algunos con numeración antigua y le puede faltar un número de inicio (tener siete cifras en lugar de ocho).

    Gracias por la observación 🙂

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *