122 lines
2.7 KiB
Go
122 lines
2.7 KiB
Go
// Package utils 身份证处理
|
|
package utils
|
|
|
|
import (
|
|
"errors"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
"unicode/utf8"
|
|
)
|
|
|
|
// GetCardAge 获取身份证年龄
|
|
func GetCardAge(cardNum string) (int, error) {
|
|
// 获取当前时间
|
|
now := time.Now()
|
|
|
|
// 解析身份证号中的出生日期
|
|
birthDateStr := cardNum[6:14]
|
|
birthYear, err := strconv.Atoi(birthDateStr[0:4])
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
birthMonth, err := strconv.Atoi(birthDateStr[4:6])
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
// 计算年龄
|
|
age := now.Year() - birthYear
|
|
if now.Month() < time.Month(birthMonth) {
|
|
age--
|
|
}
|
|
|
|
return age, nil
|
|
}
|
|
|
|
// CheckCardNum 检测身份证号
|
|
func CheckCardNum(cardNum string) (bool, error) {
|
|
regex := `^(?:1[1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]|6[1-5])\d{4}(?:1[89]|20)\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])\d{3}[\dxX]$`
|
|
match, err := regexp.MatchString(regex, cardNum)
|
|
if !match || err != nil {
|
|
return false, errors.New("身份证号错误")
|
|
}
|
|
return true, nil
|
|
}
|
|
|
|
// GetCardSex 获取身份证性别
|
|
func GetCardSex(cardNum string) (int, error) {
|
|
genderStr := cardNum[len(cardNum)-2 : len(cardNum)-1]
|
|
genderNum, err := strconv.Atoi(genderStr)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
// 判断性别
|
|
if genderNum%2 == 0 {
|
|
return 2, nil
|
|
} else {
|
|
return 1, nil
|
|
}
|
|
}
|
|
|
|
// GetMaskCardNum 身份证号码脱敏
|
|
func GetMaskCardNum(cardNum string) string {
|
|
if len(cardNum) != 18 {
|
|
return cardNum
|
|
}
|
|
|
|
// 获取身份证号前后部分
|
|
frontPart := cardNum[0:6]
|
|
backPart := cardNum[14:]
|
|
|
|
// 替换中间部分数字为 *
|
|
middlePart := "****"
|
|
|
|
// 拼接新的身份证号
|
|
maskedIDCard := frontPart + middlePart + backPart
|
|
|
|
return maskedIDCard
|
|
}
|
|
|
|
// GetMaskCardName 身份证名字脱敏
|
|
func GetMaskCardName(cardName string) string {
|
|
// 判断姓名长度
|
|
length := utf8.RuneCountInString(cardName)
|
|
|
|
// 判断是否是英文姓名
|
|
isEnglish := strings.ContainsAny(cardName, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
|
|
|
|
if length == 2 {
|
|
// 两个字符的姓名
|
|
if isEnglish {
|
|
// 英文姓名
|
|
return string(cardName[0]) + "*"
|
|
} else {
|
|
// 中文姓名
|
|
return string([]rune(cardName)[0]) + "*"
|
|
}
|
|
} else if length == 3 {
|
|
// 三个字符的姓名
|
|
if isEnglish {
|
|
// 英文姓名
|
|
return string(cardName[0]) + "*" + string(cardName[2])
|
|
} else {
|
|
// 中文姓名
|
|
return string([]rune(cardName)[0]) + "*" + string([]rune(cardName)[2])
|
|
}
|
|
} else if length >= 4 {
|
|
// 四个及以上字符的姓名
|
|
if isEnglish {
|
|
// 英文姓名
|
|
return string(cardName[0]) + "*" + string(cardName[length-1])
|
|
} else {
|
|
// 中文姓名
|
|
return string([]rune(cardName)[0]) + "*" + string([]rune(cardName)[length-1])
|
|
}
|
|
}
|
|
|
|
return cardName
|
|
}
|