项目需要,没找到好用的,所以自己根据国标写了一个。分享一下。
https://github.com/bluesky335/IDCheck
用于校验 身份证号码
和 法人和其他组织统一社会信用代码
的工具。
计算规则参考国家标准文件:
标准号:GB 11643-1999:公民身份证号码
标准号:GB 32100-2015:法人和其他组织统一社会信用代码编码规则
注:由于早期部分试点地区推行
法人和其他组织统一社会信用代码
较早,会存在部分代码不符合国家标准的情况。但它们都是合法的代码,应当另行处理。 例如:福建恒跃柳工机械销售有限公司:
91350100M0001TGQXM
计算出的校验位是 1 和 M 不符厦门云上晴空航空科技有限公司:
91350211M0000XUF46
计算出的校验位是 R 和 6 不符厦门黑脉网络科技有限公司
91350203M0001FUE2P
计算出的校验位是 J 和 P 不符
go get github.com/bluesky335/IDCheck
法人和其他组织统一社会信用代码
import "github.com/bluesky335/IDCheck/USCI"
var usci = USCI.New("91350100M000100Y43")
if usci.IsValid() {
fmt.Printf("✅正确\n")
} else {
fmt.Printf("❌错误\n")
}
身份证号码
import "github.com/bluesky335/IDCheck/IdNumber"
var id = IdNumber.New("11010519491231002X")
if id.IsValid() {
fmt.Printf("%s -> %s\n", id, "✅正确")
} else {
fmt.Printf("%s -> %s\n", id, "❌错误")
}
1
Smash 2020-01-01 12:21:54 +08:00 via Android
元旦大家都不摸鱼了,挽尊
|
2
BlueSky335 OP @Smash 苦逼码农,我太难了😂
|
3
mscb 2020-01-01 12:42:06 +08:00 via Android
好东西,已 star
|
4
AMGRRR 2020-01-01 15:52:23 +08:00 via Android
这是干啥用的?
|
5
BlueSky335 OP @AMGRRR 身份证和统一社会信用代码是有校验位的,这个就是用来检验他们是不是正确的身份证号码和信用代码,确保不是乱填的。
|
6
MrUser 2020-01-01 16:06:33 +08:00
要是有试点地区早期的验证规则就完美了
|
7
BlueSky335 OP @MrUser 国标文件里没有写😂
|
8
loading 2020-01-01 16:25:05 +08:00
建议带上 js 代码,方便前后端一套。
|
9
T3RRY 2020-01-01 23:18:13 +08:00
收藏
|
10
BlueSky335 OP @loading 有空我加上
|
11
as80393313 2020-01-02 16:53:32 +08:00 1
@loading
作者写得有点香啊,这是基于他的改成 JS 版本,简单测试了一下可行,IE5+ /** * @description 校验身份证 (计算规则参考“中国国家标准化管理委员会”官方文档: http://www.gb688.cn/bzgk/gb/newGbInfo?hcno=080D6FBF2BB468F9007657F26D60013E ) * @param value {string} 验证参数 * @return {boolean} */ function isID (value) { if (typeof value != 'string') { console.warn('参数类型错误:参数类型为 String') return false } // a1 与对应的校验码对照表,其中 key 表示 a1,value 表示校验码,value 中的 10 表示校验码 X var a1Map = { 0: 1, 1: 0, 2: 10, 3: 9, 4: 8, 5: 7, 6: 6, 7: 5, 8: 4, 9: 3, 10: 2 }; var idStr = value.toUpperCase() var reg = /^[0-9]{17}[0-9X]$/ if (!reg.exec(idStr)) { return false } var sum = 0 var signChar = '' for (var index = 0; index < idStr.length; index++) { var i = 18 - index var c = idStr.charAt(index) var v, weight if (i != 1) { v = parseInt(c) if (!isNaN(v)) { // 计算加权因子 weight = parseInt(Math.pow(2, parseFloat(i - 1))) % 11 sum += (v * weight) } else { return false } } else { signChar = c.toString() } } var a1 = a1Map[sum % 11] var a1Str = a1.toString() if (a1 == 10) { a1Str = 'X' } return a1Str == signChar } /** * @description 校验法人和其他组织统一社会信用代码的合法性 (// 计算规则参考“中国国家标准化管理委员会”官方文档: http://www.gb688.cn/bzgk/gb/newGbInfo?hcno=24691C25985C1073D3A7C85629378AC0 ) * @param value {string} 验证参数 * @return {boolean} */ function isUSCI (value) { if (typeof value != 'string') { console.warn('参数类型错误:参数类型为 String') return false } // 代码字符对应的值 var valueMap = { '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, 'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15, 'G': 16, 'H': 17, 'J': 18, 'K': 19, 'L': 20, 'M': 21, 'N': 22, 'P': 23, 'Q': 24, 'R': 25, 'T': 26, 'U': 27, 'W': 28, 'X': 29, 'Y': 30 } var usciStr = value.toUpperCase() var reg = /^[A-Z0-9]{18}$/ if (!reg.exec(usciStr)) { console.log('exec:') return false } var weight = 0, sum = 0, index = 0, c, v, usciStrRange = usciStr.slice(0, 17) for (index = 0; index < usciStrRange.length; index++) { c = usciStrRange.charAt(index) v = valueMap[c] weight = parseInt(Math.pow(3, parseFloat(index))) % 31 sum += v * weight } var mod = sum % 31 var sign = 31 - mod if (sign == 31) { sign = 0 } var signChar for (var key in valueMap) { signChar = key if (valueMap[key] == sign) { break } } var lastStr = usciStr.slice(17, 18) var signStr = signChar.toString() return signStr == lastStr } |
12
BlueSky335 OP @as80393313 我加进去了,更新了一下
|
13
as80393313 2020-01-03 15:03:57 +08:00
|
14
BlueSky335 OP @as80393313 已经添加链接,并移除了我仓库里的 js 代码。
|
15
as80393313 2020-01-03 17:12:45 +08:00
@BlueSky335 😂nice!
|