63 lines
1.7 KiB
Go
63 lines
1.7 KiB
Go
package idcard
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/fonchain/fonchain-container/pkg/util/stime"
|
|
"strconv"
|
|
)
|
|
|
|
const DEF_IDCARD_LEN = 18
|
|
|
|
func GetNativePlace(idNum string) string {
|
|
if idNum == "" {
|
|
return ""
|
|
}
|
|
var area = map[int]string{
|
|
11: "北京", 12: "天津", 13: "河北", 14: "山西", 15: "内蒙古",
|
|
21: "辽宁", 22: "吉林", 23: "黑龙江", 31: "上海", 32: "江苏",
|
|
33: "浙江", 34: "安徽", 35: "福建", 36: "江西", 37: "山东", 41: "河南", 42: "湖北",
|
|
43: "湖南", 44: "广东", 45: "广西",
|
|
46: "海南", 50: "重庆", 51: "四川", 52: "贵州", 53: "云南", 54: "西藏", 61: "陕西",
|
|
62: "甘肃", 63: "青海", 64: "宁夏",
|
|
65: "新疆", 71: "台湾", 81: "香港", 82: "澳门", 91: "国外",
|
|
}
|
|
var provinceName = ""
|
|
var ok bool
|
|
var provinceNo, _ = strconv.Atoi(idNum[0:2])
|
|
if provinceNo == 0 {
|
|
return ""
|
|
}
|
|
if provinceName, ok = area[provinceNo]; ok {
|
|
return provinceName
|
|
} else {
|
|
return ""
|
|
}
|
|
}
|
|
|
|
func GetAge(idNum string) int {
|
|
if len(idNum) < 18 {
|
|
return 0
|
|
}
|
|
birthdayStr := idNum[6:14]
|
|
fmt.Println("--------===--- idNum", idNum, "birthdayStr", birthdayStr)
|
|
birthday, _ := stime.StringToTimeWithFormat(birthdayStr, stime.Format_NoSpacer_YMD)
|
|
if birthday == nil {
|
|
return 0
|
|
}
|
|
return stime.GetAge(*birthday)
|
|
}
|
|
func Validate(idCard string) bool {
|
|
idLen := len(idCard)
|
|
if idLen != DEF_IDCARD_LEN { // lenght check failed
|
|
return false
|
|
}
|
|
weight := []int{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}
|
|
validate := []byte{'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'}
|
|
sum := 0
|
|
for i := 0; i < len(weight); i++ {
|
|
sum += weight[i] * int(byte(idCard[i])-'0')
|
|
}
|
|
m := sum % 11
|
|
return validate[m] == idCard[idLen-1]
|
|
}
|