Saltar al contingut
nif-dni-nie-cif-validation: validació de NIF, DNI, NIE i CIF espanyolsnif-dni-nie-cif-validation: validació de NIF, DNI, NIE i CIF espanyols

Valideu NIF, DNI, NIE i CIF espanyols

Correcta, ràpida, petita i tipada. Cada regla té una font documentada a SPEC.md, i cada error explica per què.

Instal·lació amb npm
npm i nif-dni-nie-cif-validation yarn add nif-dni-nie-cif-validation pnpm add nif-dni-nie-cif-validation bun add nif-dni-nie-cif-validation

Proveu-la

Escriviu o enganxeu un NIF, DNI, NIE o CIF. La mateixa biblioteca el comprova mentre escriviu i us diu per què no és vàlid.

Podeu fer servir espais, punts, guionets i minúscules; per exemple, 12.345.678-z.

El resultat apareix aquí mentre escriviu.

El validador en directe necessita JavaScript. La resta de la pàgina funciona sense.

S'executa del tot al vostre navegador: cap dada no surt del navegador.

Per què aquesta biblioteca

  • Correcta, amb fonts

    24 regles, cadascuna amb un identificador (DNI-2, NIE-3, CIF-3…) i la seva font documentada a SPEC.md: una font oficial (el BOE, l'AEAT), una convenció identificada com a tal o el contracte de la biblioteca. Cada error indica la regla que no s'ha complert.

  • Ràpida

    Com a mínim 6,3 vegades el rendiment de qualsevol altra biblioteca provada

    60,1 M ops/s amb DNI (milions de validacions per segon; com més alta és la xifra, més alt és el rendiment), amb un rendiment d'entre 7,0 i 8,9 vegades el de la v1.

  • Petita

    929 B min+gzip per a isValidNif i 4,7 kB per a tota la biblioteca. Admet tree shaking, i cada idioma s'importa per separat.

    Algunes biblioteques d'un sol propòsit ocupen menys per a un validador (@maistik/validate-nif 456 B, @kreyo/nif-validator 533 B, spain-id 583 B i dni-js 882 B). Algunes validen menys tipus: aquesta dedica bytes a normalitzar l'entrada, als tipus de control de CIF-3 i als NIF K/L/M.

  • 0 dependències

    Cap dependència en temps d'execució. Zod, Valibot i Yup són dependències peer opcionals, que només necessiten els seus adaptadors.

  • Tipada

    Escrita en TypeScript, amb declaracions per a import i require. Mòduls ES i CommonJS, compilats a ES2016.

  • No llança mai excepcions

    Els validadors accepten unknown: null, números i objectes donen false, o NOT_A_STRING amb validate(). El que escrigui l'usuari no la fa fallar mai.

  • 5 idiomes

    Missatges d'error i noms dels tipus d'entitat en anglès, castellà, català, basc i gallec. El validador d'aquí dalt parla l'idioma d'aquesta pàgina.

  • Generadors i esquemes

    Generadors de dades de prova amb llavor, i esquemes de Zod, Valibot i Yup que retornen el valor normalitzat i el missatge en el vostre idioma.

Mesurat en un AMD EPYC 9V74 80-Core Processor amb Node.js v24.21.0 el 2 d’octubre del 2026, cada biblioteca amb les opcions per defecte. Les proporcions entre biblioteques es mantenen millor d'una màquina a una altra que les xifres absolutes.

Feu-la servir

Comprovacions booleanes per a un sí o un no, validate() quan necessiteu saber per què, punts d'entrada opcionals per a esquemes i dades de prova, i una línia d'ordres per a terminals, scripts i agents d'IA.

Exemples de codi
import { isValidNif } from "nif-dni-nie-cif-validation";
isValidNif("12345678Z"); // true
isValidNif(" 12.345.678-z "); // true: s'eliminen els espais, els punts i els guionets, i les minúscules passen a majúscules
isValidNif("B12345675"); // false: la xifra de control no és correcta
isValidNif(null); // false: no llança mai excepcions
import { validate } from "nif-dni-nie-cif-validation";
import { ca } from "nif-dni-nie-cif-validation/locales/ca";
validate(" b-1234567-4 ", { locale: ca });
// { valid: true, type: "CIF", normalized: "B12345674",
// meta: { orgKey: "B", orgDescription: "Societat de responsabilitat limitada" } }
validate("12345678A", { locale: ca }).error;
// { code: "INVALID_CONTROL_CHARACTER", rule: "DNI-2", expected: "Z",
// message: "El caràcter de control no és correcte: per a aquest DNI hauria de ser «Z»." }
validate(" 12.345.678-z ").normalized; // "12345678Z": deseu aquest valor
import { z } from "zod";
import { ca } from "nif-dni-nie-cif-validation/locales/ca";
import { zNif } from "nif-dni-nie-cif-validation/zod";
const schema = z.object({ nif: zNif({ types: ["DNI", "NIE"], locale: ca }) });
schema.parse({ nif: " 12.345.678-z " }); // { nif: "12345678Z" }
schema.safeParse({ nif: "B12345674" }).success; // false: aquí no s'accepta cap CIF
import * as v from "valibot";
import { ca } from "nif-dni-nie-cif-validation/locales/ca";
import { vNif } from "nif-dni-nie-cif-validation/valibot";
const schema = v.object({ nif: vNif({ types: ["DNI", "NIE"], locale: ca }) });
v.parse(schema, { nif: " 12.345.678-z " }); // { nif: "12345678Z" }
v.safeParse(schema, { nif: "B12345674" }).success; // false: aquí no s'accepta cap CIF
import { object } from "yup";
import { ca } from "nif-dni-nie-cif-validation/locales/ca";
import { yNif } from "nif-dni-nie-cif-validation/yup";
const schema = object({ nif: yNif({ types: ["DNI", "NIE"], locale: ca }) });
schema.validateSync({ nif: " 12.345.678-z " }); // { nif: "12345678Z" }
schema.isValidSync({ nif: "B12345674" }); // false: aquí no s'accepta cap CIF
import { createGenerator, generateCif, generateDni, generateNie } from "nif-dni-nie-cif-validation/generate";
generateDni({ seed: 1 }); // "62707394X": el mateix a cada execució i plataforma
generateNie({ seed: 1, prefix: "Z" }); // "Z6270739R"
generateCif({ seed: 1, orgKey: "B" }); // "B62707393"
generateDni({ seed: 1, format: true }); // "62707394-X"
const gen = createGenerator(42); // una seqüència amb llavor: valors diferents, els mateixos a cada execució
gen.nif(); // "Y8524657C"
gen.nif(); // "X5265925Y"
Terminal window
npx nif-dni-nie-cif-validation validate 12345678Z B12345674 12345678A --locale ca
# 12345678Z: valid DNI 12345678Z
# B12345674: valid CIF B12345674 (Societat de responsabilitat limitada)
# 12345678A: invalid [DNI-2 INVALID_CONTROL_CHARACTER] El caràcter de control no és correcte: per a aquest DNI hauria de ser «Z».
npx nif-dni-nie-cif-validation generate dni --count 2 --seed 42
# 60110375J
# 44829056D

npx descarrega el paquet la primera vegada. La sortida JSON per a scripts i agents, els codis de sortida, les dades de prova i la revisió de fitxers CSV són a la guia de la línia d'ordres.

Comparació

Rendiment amb el conjunt de DNI, en milions de validacions per segon (M ops/s; com més alta és la xifra, més alt és el rendiment), i mida d'un validador de qualsevol tipus (min+gzip; com més baixa és la xifra, més petita és la mida).

Rendiment i mida de les biblioteques d'identificadors espanyols a npm
BibliotecaDNI, M ops/sMida, qualsevol tipus
nif-dni-nie-cif-validation aquesta versió60,12929 B
@maistik/validate-nif 2.0.19,46456 B
dni-js 1.0.08,90882 B
nif-dni-nie-cif-validation 1.0.118,591.517 B
better-dni 4.4.28,441.134 B
spain-id 1.1.146,96583 B
validator.js isIdentityCard(x, "ES") 13.15.355,732.539 B
validator.js isTaxID(x, "es-ES") 13.15.354,226.537 B
@kreyo/nif-validator 0.1.02,78533 B
jsvat (Spain) 2.5.42,101.186 B
stdnum 1.12.60,4151.063 B

Totes les xifres surten de bench/results/latest.json. La velocitat no ho és tot: la pàgina de rendiment enllaça els resultats complets, que també comparen la concordança amb SPEC.md i les funcionalitats.

Rendiment i comparació complets →