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è.
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-validationDades del 3 d’octubre del 2026
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.
Els números generats són ficticis i només serveixen per a proves: algun podria coincidir per casualitat amb el d'una persona o empresa real.
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.
import { isValidNif } from "nif-dni-nie-cif-validation";
isValidNif("12345678Z"); // trueisValidNif(" 12.345.678-z "); // true: s'eliminen els espais, els punts i els guionets, i les minúscules passen a majúsculesisValidNif("B12345675"); // false: la xifra de control no és correctaisValidNif(null); // false: no llança mai excepcionsimport { 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 valorimport { 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 CIFimport * 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 CIFimport { 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 CIFimport { createGenerator, generateCif, generateDni, generateNie } from "nif-dni-nie-cif-validation/generate";
generateDni({ seed: 1 }); // "62707394X": el mateix a cada execució i plataformagenerateNie({ 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"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# 44829056Dnpx 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).
| Biblioteca | DNI, M ops/s | Mida, qualsevol tipus |
|---|---|---|
| nif-dni-nie-cif-validation aquesta versió | 929 B | |
| @maistik/validate-nif 2.0.1 | 456 B | |
| dni-js 1.0.0 | 882 B | |
| nif-dni-nie-cif-validation 1.0.11 | 1.517 B | |
| better-dni 4.4.2 | 1.134 B | |
| spain-id 1.1.14 | 583 B | |
| validator.js isIdentityCard(x, "ES") 13.15.35 | 2.539 B | |
| validator.js isTaxID(x, "es-ES") 13.15.35 | 6.537 B | |
| @kreyo/nif-validator 0.1.0 | 533 B | |
| jsvat (Spain) 2.5.4 | 1.186 B | |
| stdnum 1.12.6 | 51.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.