/** * 身份证号码验证接口 */ interface IDCardValidationResult { isValid: boolean message?: string } /** * 验证身份证号码 * @param id 身份证号码 * @returns boolean */ export const isValidIDCard = (id: string): boolean => { if (!id) return false // 15 位身份证验证 if (id.length === 15) { return isValidIDCard15(id) } // 18 位身份证验证 if (id.length === 18) { return isValidIDCard18(id) } return false } /** * 验证银行卡号 * @param cardNumber 银行卡号 * @returns boolean */ export const isValidBankCard = (cardNumber: string): boolean => { // 银行卡号只检查长度和是否为数字 return /^\d{16,19}$/.test(cardNumber) } /** * 验证15位身份证号码 * @param id 15位身份证号码 * @returns boolean */ function isValidIDCard15(id: string): boolean { // 只检查是否为 15 位纯数字 const regex = /^\d{15}$/ if (!regex.test(id)) return false // 校验出生日期 const year = parseInt(id.substr(6, 2)) const month = parseInt(id.substr(8, 2)) const day = parseInt(id.substr(10, 2)) // 使用当前年份来做年份范围的检查 const currentYear = new Date().getFullYear() const fullYear = year + (year >= 50 ? 1900 : 2000) // 日期校验 const birthDate = new Date(fullYear, month - 1, day) return ( birthDate.getFullYear() === fullYear && birthDate.getMonth() === month - 1 && birthDate.getDate() === day ) } /** * 验证18位身份证号码 * @param id 18位身份证号码 * @returns boolean */ function isValidIDCard18(id: string): boolean { // 只检查是否为 18 位的数字或X结尾 const regex = /^\d{17}(\d|X)$/ if (!regex.test(id)) return false // 校验出生日期 const year = parseInt(id.substr(6, 4)) const month = parseInt(id.substr(10, 2)) const day = parseInt(id.substr(12, 2)) const birthDate = new Date(year, month - 1, day) return ( birthDate.getFullYear() === year && birthDate.getMonth() === month - 1 && birthDate.getDate() === day ) } /** * 掩码处理身份证号码 * @param idNumber 身份证号码 * @returns string 掩码后的身份证号码 */ export const maskIdNumber = (idNumber: string): string => { if (!idNumber) return idNumber // 处理18位身份证 if (idNumber.length === 18) { return idNumber.replace(/^(\d{6})(\d{8})(\d{4})$/, '$1********$3') } // 处理15位身份证 if (idNumber.length === 15) { return idNumber.replace(/^(\d{6})(\d{6})(\d{3})$/, '$1******$3') } return idNumber } /** * 数字转中文大写 * @param num 需要转换的数字 * @returns string 转换后的中文大写 */ export const convertToChineseUppercase = (num: number): string => { const units = ['个', '十', '百', '千', '万', '十万', '百万', '千万', '亿'] const digits = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'] if (num === 0) return digits[0] let result = '' let unitIndex = 0 let zeroFlag = false while (num > 0) { const digit = num % 10 if (digit > 0) { result = digits[digit] + (units[unitIndex] || '') + result zeroFlag = false } else if (!zeroFlag) { result = digits[0] + result zeroFlag = true } num = Math.floor(num / 10) unitIndex++ } return result .replace(/零+/g, '零') .replace(/零$/, '') .replace(/个$/, '') } /** * 验证身份证号码并返回详细信息 * @param id 身份证号码 * @returns IDCardValidationResult */ export const validateIDCard = (id: string): IDCardValidationResult => { if (!id) { return { isValid: false, message: '身份证号码不能为空' } } if (id.length !== 15 && id.length !== 18) { return { isValid: false, message: '身份证号码长度不正确' } } const isValid = isValidIDCard(id) return { isValid, message: isValid ? undefined : '身份证号码格式不正确' } } /** * 验证银行卡号并返回详细信息 * @param cardNumber 银行卡号 * @returns { isValid: boolean, message?: string } */ export const validateBankCard = (cardNumber: string): { isValid: boolean; message?: string } => { if (!cardNumber) { return { isValid: false, message: '银行卡号不能为空' } } const isValid = isValidBankCard(cardNumber) return { isValid, message: isValid ? undefined : '银行卡号格式不正确' } }