DEV Community

ToolRapido
ToolRapido

Posted on

Cómo validar NIF, CIF y NIE en JavaScript: el algoritmo explicado

Si desarrollas software para el mercado español, tarde o temprano necesitas validar documentos fiscales: NIF, CIF o NIE. Aquí explico cómo funciona el algoritmo oficial y cómo implementarlo.

El algoritmo del NIF (y DNI)

El NIF de persona física son 8 dígitos + 1 letra de control. La letra se calcula así:

  1. Toma los 8 dígitos
  2. Divide entre 23
  3. El resto (0-22) selecciona una letra de esta cadena: TRWAGMYFPDXBNJZSQVHLCKE
function validateNIF(nif) {
  const letters = 'TRWAGMYFPDXBNJZSQVHLCKE';
  const cleaned = nif.toUpperCase().trim();
  const num = parseInt(cleaned.slice(0, 8), 10);
  const letter = cleaned.slice(-1);
  return letters[num % 23] === letter;
}
Enter fullscreen mode Exit fullscreen mode

El algoritmo del NIE

El NIE empieza por X, Y o Z. Se sustituye por 0, 1 o 2 respectivamente, y se aplica el mismo algoritmo que el NIF.

function validateNIE(nie) {
  const letters = 'TRWAGMYFPDXBNJZSQVHLCKE';
  const cleaned = nie.toUpperCase().trim();
  const first = { X: '0', Y: '1', Z: '2' }[cleaned[0]];
  if (!first) return false;
  const num = parseInt(first + cleaned.slice(1, 8), 10);
  return letters[num % 23] === cleaned.slice(-1);
}
Enter fullscreen mode Exit fullscreen mode

El algoritmo del CIF (empresas)

El CIF es más complejo: letra de tipo + 7 dígitos + carácter de control.

function validateCIF(cif) {
  const cleaned = cif.toUpperCase().trim();
  const validLetters = 'ABCDEFGHJKLMNPQRSUVW';
  if (!validLetters.includes(cleaned[0])) return false;

  const digits = cleaned.slice(1, 8);
  let oddSum = 0, evenSum = 0;

  for (let i = 0; i < 7; i++) {
    const d = parseInt(digits[i], 10);
    if (i % 2 === 0) {
      const doubled = d * 2;
      oddSum += doubled > 9 ? doubled - 9 : doubled;
    } else {
      evenSum += d;
    }
  }

  const total = oddSum + evenSum;
  const control = (10 - (total % 10)) % 10;
  const lastChar = cleaned.slice(-1);
  const controlLetters = 'JABCDEFGHI';

  return lastChar === String(control) || lastChar === controlLetters[control];
}
Enter fullscreen mode Exit fullscreen mode

Casos de uso habituales

  • Tests automatizados: generar datos válidos para Jest, Vitest, Cypress
  • Seeding de bases de datos: poblar entornos de desarrollo sin usar datos reales
  • Validación de formularios: verificar que el campo NIF funciona en producción

Si no quieres implementarlo tú mismo, hay herramientas online que validan y generan NIF, CIF y NIE aleatorios válidos para pruebas, como este validador y generador gratuito.

Conclusión

El algoritmo es sencillo pero tiene sus matices, especialmente en el CIF. Implementarlo bien y testearlo te ahorra sorpresas en producción con datos reales.

Top comments (0)