The fastest Spanish DNI (NIE / NIF) validation out there — And lighter: 660 bytes.
// npm
npm i better-dni
// yarn
yarn add better-dniimport { isValid, isNIF, isNIE, ctrlChar } from "better-dni";
// validates any type of DNI (NIE or NIF)
isValid("Z7662566Y"); //=> true
// checks if it is a valid NIF
isNIF("06672804K"); //=> true
// checks if it is a valid NIE
isNIE("X1302311M"); //=> true
// returns the control letter in upper case
ctrlChar("X1302311M"); //=> 'M'
ctrlChar("X1302311"); //=> 'M'import { randomNIF, randomNIFWith } from "better-dni";
randomNIF(); //=> '31719111H'
// returns a valid random NIF given the control letter
randomNIFWith("C"); // => '95652190C'
// a seed (Number) can be provided and it will always return the same result
randomNIFWith("G", 1); //=> '95652174G'
randomNIFWith("G", 1); //=> '95652174G'import { randomNIE, randomNIEWith } from "better-dni";
randomNIE(); //=> 'X1120409X'
// returns a valid random NIE given the first and control letter
randomNIEWith("Y", "C"); //=> 'Y2098020C'
randomNIEWith("Z", "G"); //=> 'Z5670557G'
// a seed (Number) can be provided and it will always return the same result
randomNIEWith("X", "E", 1); //=> 'X2080280E'
randomNIEWith("X", "E", 1); //=> 'X2080280E'// Returns a "clean" dni string removing spaces, dashes, etc.
normalize(" x-9464186_p "); // => "X9464186P"better-dni does a similar job as other libraries like dni-js, dni-js-validator, and @willowi/validate-nif but better-dni is built with optimization and speed in mind. Take a look at these benchmark results:
yarn run benchmark| lib | method | time | diff |
|---|---|---|---|
| better-dni | #isValid | 0 s + 365932959 ns | |
| dni-js-validator | #isValid | 1 s + 154193500 ns | x3.15 slower |
| dni-js | #isValid | 1 s + 188613500 ns | x3.24 slower |
| @willowi/validate-nif | #validateNif | 4 s + 986185000 ns | x13.62 slower |
| lib | method | time | diff | |
|---|---|---|---|---|
| better-dni | #ctrlChar | 0 s + 423324167 ns | ||
| dni-js | #getLetter | 0 s + 354445959 ns | x1.16 faster | 😲 |
| dni-js-validator | no method | - | ||
| @willowi/validate-nif | no method | - |
Benchmark on a MacBook M2 Pro (16-inch, 2023) - 16 GB Node v20.7.0
https://better-dni.singuerinc.com/
- spain-phone - Spanish phone number validation