@code-ts/cin
Version:
Utils about citizen identification number | 公民身份证号码工具方法
31 lines (26 loc) • 910 B
JavaScript
;
const CIN_PATTERN = /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[\dx]$/i;
const CIN_LENGTH = 18;
const CIN_MOD = 11;
const CIN_PARITY = ["1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"];
const CIN_FACTORS = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
function validateCIN(code) {
if (code.length !== CIN_LENGTH) return false;
if (!CIN_PATTERN.test(code)) return false;
const sum = code.split("").filter((_, idx) => idx < 17).reduce((acc, char, idx) => acc + Number.parseInt(char, 10) * CIN_FACTORS[idx], 0);
return CIN_PARITY[sum % CIN_MOD] === code.charAt(17).toUpperCase();
}
function parseCIN(code) {
const isValid = validateCIN(code);
if (!isValid) {
return {
isValid
};
}
return {
isValid
};
}
exports.CIN_PATTERN = CIN_PATTERN;
exports.parseCIN = parseCIN;
exports.validateCIN = validateCIN;