Last active
March 9, 2016 11:01
-
-
Save tokland/dd550dc575ebc1a9e1ed to your computer and use it in GitHub Desktop.
DNI/NIF validators (Spain ID documents)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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