github.com/isyscore/isc-gobase@v1.5.3-0.20231218061332-cbc7451899e9/validate/matcher/idCardValidate.go (about)

     1  package matcher
     2  
     3  import (
     4  	"regexp"
     5  	"strconv"
     6  )
     7  
     8  var idCardSize = 17
     9  
    10  // 加权因子
    11  var weightFactor = [17]int{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}
    12  
    13  // 校验码
    14  var checkCode = [11]string{"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"}
    15  
    16  // 第一位不可能是0
    17  // 第二位到第六位可以是0-9
    18  // 第七位到第十位是年份,所以七八位为19或者20
    19  // 十一位和十二位是月份,这两位是01-12之间的数值
    20  // 十三位和十四位是日期,是从01-31之间的数值
    21  // 十五,十六,十七都是数字0-9
    22  // 十八位可能是数字0-9,也可能是X
    23  var idCardPatter = "^[1-9][0-9]{5}([1][9][0-9]{2}|[2][0][0|1][0-9])([0][1-9]|[1][0|1|2])([0][1-9]|[1|2][0-9]|[3][0|1])[0-9]{3}([0-9]|[X])$"
    24  
    25  func idCardIsValidate(idCard string) bool {
    26  	if idCard == "" {
    27  		return false
    28  	}
    29  
    30  	if len(idCard) < idCardSize {
    31  		return false
    32  	}
    33  
    34  	seventeen := idCard[:idCardSize]
    35  
    36  	num := 0
    37  	for index, data := range seventeen {
    38  		r, _ := strconv.Atoi(string(data))
    39  		num += r * weightFactor[index]
    40  	}
    41  
    42  	if idCard[len(idCard)-1:] != checkCode[num%11] {
    43  		return false
    44  	}
    45  
    46  	result, _ := regexp.MatchString(idCardPatter, idCard)
    47  	return result
    48  }