身份证算法

	<body>
		输入身份证:<input type="text" id=shenfen>
		<script src="../../js/citys.js"></script>
		<script>
			var sf=document.querySelector("#shenfen")
			sf.onblur=function(){
				var num=this.value;
				var flag=checkId(num);
				if(!flag){
					alert("身份证信息有错误")
				}
			}
			
			/*
						 18位: 41072419980815451x
						 410724 1998 0815 451x
						 41:省编码前2位
						 4107:市编码前4位
						 410724:县编码
						 45:派出所编码
						 1:奇数为男,偶数为女
						 x:计算所得
						     1、将前面的身份证号码17位数分别乘以不同的系数。
						        从第一位到第十七位的系数分别为:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2;
						     2、将这17位数字和系数相乘的结果相加;
						     3、用加出来和除以11,看余数是多少;
						     4、余数只可能有0、1、2、3、4、5、6、7、8、9、10这11个数字,
							       其分别对应的最后一位身份证的号码为1、0、X、9、8、7、6、5、4、3、2。
						*/
			function checkId(ID) {
				if (ID.length != 18) {
					return false;
				}

				//获取身份证前两位,省编码
				var provinceCode = ID.substr(0, 2);
				//获取省的数组
				var provinces = citys.districts[0].districts;
				//获取得到对应的省份编码
				var province = provinces.find(function(obj) {
					return obj.adcode.startsWith(provinceCode);
				})
				//获取身份证前4位  市编码前两位
				//省没有找到
				if (province == undefined) {
					return false;
				}
				//	获取市的编码
				var cityCode = ID.substr(0, 4);
				var city = province.districts;
				var ct = city.find(function(obj) {
					return obj.adcode.startsWith(cityCode);
				})
				if (ct == undefined) {
					return false;
				}
				//获取身份证前6位 
				var countyCode = ID.substr(0, 6);
				var countys = ct.districts
				var county = countys.find(function(obj) {
					return obj.adcode == countyCode;
				})
				if (county == undefined) {
					return false;
				}
				//验证最后一位
				var nums = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
				//分别相乘
				var res = nums.reduce(function(res, obj, index) {
					res += ID.charAt(index) * obj;
					return res;
				},0)
			//拿到余数
				var mod = res % 11;
				var endNums = [1, 0, "x", 9, 8, 7, 6, 5, 4, 3, 2];
				if (ID.substring(17) != endNums[mod]) {
					return false;
				}
				return true;
			}
			console.log(checkId("410721200109163536"));
		</script>
	</body>

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值