Skip to content

Instantly share code, notes, and snippets.

@tokland
Last active March 9, 2016 11:01
Show Gist options
  • Save tokland/dd550dc575ebc1a9e1ed to your computer and use it in GitHub Desktop.
Save tokland/dd550dc575ebc1a9e1ed to your computer and use it in GitHub Desktop.
DNI/NIF validators (Spain ID documents)
/* Return sum of numbers in array xs */
function sum(xs) {
return xs.reduce(function(a, b) { return a + b }, 0);
}
/* Return true if string s is a valid DNI */
function validateDNI(s) {
var control_letters = 'TRWAGMYFPDXBNJZSQVHLCKE';
var regexp = /^[\dKLMXYZ]\d{7}[A-Z]$/;
if (!s.match(regexp)) {
return false;
} else {
var control_letter = s[s.length-1];
var digits = s.match(/\d+/)[0]
var expected_control_digit = parseInt(digits) % 23;
var expected_control_letter = control_letters[expected_control_digit];
return (control_letter == expected_control_letter);
}
}
/* Return true if string s is a valid NIF */
function validateNIF(s) {
var regexp = /^[A-Z]\d{7}[A-Z0-9]$/;
var control_letters = 'JABCDEFGHI';
var validation = {with_digit: 'ABCDEFGHJUV', with_letter: 'NPQRSW'};
if (!s.match(regexp)) {
return false;
} else {
var code = s[0];
var digits = s.slice(1, -1);
var control_char = s[s.length - 1];
var control_digit_values = digits.split('').map(function(digit, idx) {
if ((idx + 1) % 2 == 0) {
return parseInt(digit);
} else {
var digits_of_double = (2 * parseInt(digit)).toString().split('');
return sum(digits_of_double.map(function(c) { return parseInt(c) }));
}
});
var expected_control_digit = (10 - (sum(control_digit_values) % 10)) % 10;
if (validation.with_digit.indexOf(code) >= 0) {
return control_char == expected_control_digit;
} else if (validation.with_letter.indexOf(code) >= 0) {
return control_char == control_letters[expected_control_digit];
} else {
return false;
}
}
}
/* Return true if Spanish DNI or NIF validate */
function validateID(s) {
return validateDNI(s) || validateNIF(s);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment