GO检查身份证号

2022-04-13  本文已影响0人  秀秀小虞儿
func IsIDCard(id string) bool {
    id = strings.ToUpper(id)
    if len(id) != 15 && len(id) != 18 {
        return false
    }
    r := regexp.MustCompile("(\\d{15})|(\\d{17}([0-9]|X))")
    if !r.MatchString(id) {
        return false
    }
    if len(id) == 15 {
        tm2, _ := time.Parse("01/02/2006", string([]byte(id)[8:10])+"/"+string([]byte(id)[10:12])+"/"+"19"+string([]byte(id)[6:8]))
        if tm2.Unix() <= 0 {
            return false
        }
        return true
    } else {
        tm2, _ := time.Parse("01/02/2006", string([]byte(id)[10:12])+"/"+string([]byte(id)[12:14])+"/"+string([]byte(id)[6:10]))
        if tm2.Unix() <= 0 {
            return false
        }
        // 检验18位身份证的校验码是否正确。
        // 校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
        arrInt := []int{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}
        arrCh := []string{"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"}
        sign := 0
        for k, v := range arrInt {
            intTemp, _ := strconv.Atoi(string([]byte(id)[k : k+1]))
            sign += intTemp * v
        }
        n := sign % 11
        valNum := arrCh[n]
        if valNum != string([]byte(id)[17:18]) {
            return false
        }
        return true
    }
}
上一篇 下一篇

猜你喜欢

热点阅读