// Devuelve un booleano si es un NSS válido
// (deben ser 11 dígitos sin otro caracter en el medio)
function nssValido(nss) {
const re = /^(\d{2})(\d{2})(\d{2})\d{5}$/,
validado = nss.match(re);
if (!validado) // 11 dígitos y subdelegación válida?
return false;
const subDeleg = parseInt(validado[1],10),
anno = new Date().getFullYear() % 100;
var annoAlta = parseInt(validado[2],10),
annoNac = parseInt(validado[3],10);
//Comparar años (excepto que no tenga año de nacimiento)
if (subDeleg != 97) {
if (annoAlta <= anno) annoAlta += 100;
if (annoNac <= anno) annoNac += 100;
if (annoNac > annoAlta)
return false; // Err: se dio de alta antes de nacer!
}
return luhn(nss);
}
// Algoritmo de Luhn
// https://es.wikipedia.org/wiki/Algoritmo_de_Luhn
function luhn(nss) {
var suma = 0,
par = false,
digito;
for (var i = nss.length - 1; i >= 0; i--) {
var digito = parseInt(nss.charAt(i),10);
if (par)
if ((digito *= 2) > 9)
digito -= 9;
par = !par;
suma += digito;
}
return (suma % 10) == 0;
}
//Handler para el evento cuando cambia el input
//Elimina cualquier caracter no numérico y comprueba validez
function validarInput(input) {
var nss = input.value.replace(/\D+/g,""),
resultado = document.getElementById("resultado"),
valido;
if (nssValido(nss)) { // ⬅️ Acá se comprueba
valido = "Válido";
resultado.classList.add("ok");
} else {
valido = "No válido";
resultado.classList.remove("ok");
}
resultado.innerText = "NSS: " + nss + "\nFormato: " + valido;
}
if (subDeleg != 97) { // Si tiene año de nacimiento
if (annoAlta <= anno) annoAlta += 100;
if (annoNac <= anno) annoNac += 100;
if (annoNac > annoAlta)
return false; // Err: se dio de alta antes de nacer!
}
社会保障号格式
社会安全号码由以下部分构成:
IMSS 子授权代码列在NSS 集成手册 ?中。虽然一些(少数)数字无效,但它们可能在未来有效,因此我们无法验证该字段。此外,在没有出生日期记录的特殊情况下,使用代码
97
。当您有出生日期时,从逻辑上讲,它必须小于工人的离职年份。
使用Luhn 算法分配校验位,这将允许我们验证 SSN。
正则短语
只会验证 11 位数字,但我们将使用表达式分别捕获前 3 个字段:
全面验证
我在 JavaScript 中发布代码以便能够在此处执行它,但是很容易将其移植到任何其他语言。
描述
在确认有 11 位数字并分开前 3 个字段后,比较出生年份在注册年份之前。由于我们只有年份的最后一位数字,如果小于当前年份,则将 100 添加到数字中(例如,'05 将大于 '99)。
然而,主要的验证是通过 Luhn 算法,它包括取奇数位的数字,偶数位的数字乘以 2。所有数字都相加(如果其中任何一个大于或等于 10,则取每个数字的总和)。
如果该总和的最后一位数字等于 ,则 SSN 有效
0
。