UNPKG

@code-ts/cin

Version:

Utils about citizen identification number | 公民身份证号码工具方法

31 lines (26 loc) 910 B
'use strict'; 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;