`
kkvsyy
  • 浏览: 29090 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

银行卡号的校验[JAVA]和身份证件号码校验[JAVASCRIPT]

阅读更多

关于上一节中的问题:银行卡号的校验我在网上找到一个简单的算法

  /**
	     * 校验银行卡卡号
	     * @param cardId
	     * @return
	     */
	    public static boolean checkBankCard(String cardId) {
	    		 char bit = getBankCardCheckCode(cardId.substring(0, cardId.length() - 1));
	    		 if(bit == 'N'){
	    			 return false;
	    		 }
	    		 return cardId.charAt(cardId.length() - 1) == bit;
	    }
	   
	    /**
	     * 从不含校验位的银行卡卡号采用 Luhm 校验算法获得校验位
	     * @param nonCheckCodeCardId
	     * @return
	     */
	    public static char getBankCardCheckCode(String nonCheckCodeCardId){
	        if(nonCheckCodeCardId == null || nonCheckCodeCardId.trim().length() == 0
	                || !nonCheckCodeCardId.matches("\\d+")) {
	        	//如果传的不是数据返回N
	            return 'N';
	        }
	        char[] chs = nonCheckCodeCardId.trim().toCharArray();
	        int luhmSum = 0;
	        for(int i = chs.length - 1, j = 0; i >= 0; i--, j++) {
	            int k = chs[i] - '0';
	            if(j % 2 == 0) {
	                k *= 2;
	                k = k / 10 + k % 10;
	            }
	            luhmSum += k;           
	        }
	        return (luhmSum % 10 == 0) ? '0' : (char)((10 - luhmSum % 10) + '0');
	    }

 关于身份证件号码的校验,比较严格的控制

	/**
	 * author:qiaoyongjun
	 * StrNo:用户输入的身份证件号码
	 * _id:用来承载错误信息的控件ID号,用来进行友好提示
	 *判断身份证号码格式函数
	 *公民身份号码是特征组合码,
	 *排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码
	 *如果验证通过 返回 true
	 */
	function isChinaIDCard(StrNo, _Id) {
		var error = document.getElementById(_Id);
		StrNo = StrNo.toString();
		if (StrNo.length == 15) {
			if (!isValidDate("19" + StrNo.substr(6, 2), StrNo.substr(8, 2),
					StrNo.substr(10, 2), _Id)) {
				return false;
			}
		} else if (StrNo.length == 18) {
			if (!isValidDate(StrNo.substr(6, 4), StrNo.substr(10, 2), StrNo
					.substr(12, 2), _Id)) {
				return false;
			}
		} else {
			error.innerHTML = "";
			error.innerHTML = "输入的身份证号码必须为15位或者18位!";
			return false;
		}

		if (StrNo.length == 18) {
			var a, b, c
			if (!isNumber(StrNo.substr(0, 17))) {

				error.innerHTML = "";
				error.innerHTML = "身份证号码错误,前17位不能含有英文字母!";
				return false;

			}
			a = parseInt(StrNo.substr(0, 1)) * 7 + parseInt(StrNo.substr(1, 1))
					* 9 + parseInt(StrNo.substr(2, 1)) * 10;
			a = a + parseInt(StrNo.substr(3, 1)) * 5
					+ parseInt(StrNo.substr(4, 1)) * 8
					+ parseInt(StrNo.substr(5, 1)) * 4;
			a = a + parseInt(StrNo.substr(6, 1)) * 2
					+ parseInt(StrNo.substr(7, 1)) * 1
					+ parseInt(StrNo.substr(8, 1)) * 6;
			a = a + parseInt(StrNo.substr(9, 1)) * 3
					+ parseInt(StrNo.substr(10, 1)) * 7
					+ parseInt(StrNo.substr(11, 1)) * 9;
			a = a + parseInt(StrNo.substr(12, 1)) * 10
					+ parseInt(StrNo.substr(13, 1)) * 5
					+ parseInt(StrNo.substr(14, 1)) * 8;
			a = a + parseInt(StrNo.substr(15, 1)) * 4
					+ parseInt(StrNo.substr(16, 1)) * 2;
			b = a % 11;
			if (b == 2) //最后一位为校验位  
			{
				c = StrNo.substr(17, 1).toUpperCase(); //转为大写X  
			} else {
				c = parseInt(StrNo.substr(17, 1));
			}
			switch (b) {
			case 0:
				if (c != 1) {
					error.innerHTML = "";
					error.innerHTML = "身份证号码校验位错:最后一位应该为:1";
					return false;
				}
				break;
			case 1:
				if (c != 0) {
					error.innerHTML = "";
					error.innerHTML = "身份证号码校验位错:最后一位应该为:0";
					return false;
				}
				break;
			case 2:
				if (c != "X") {
					error.innerHTML = "";
					error.innerHTML = "身份证号码校验位错:最后一位应该为:X";
					return false;
				}
				break;
			case 3:
				if (c != 9) {
					error.innerHTML = "";
					error.innerHTML = "身份证号码校验位错:最后一位应该为:9";
					return false;
				}
				break;
			case 4:
				if (c != 8) {
					error.innerHTML = "";
					error.innerHTML = "身份证号码校验位错:最后一位应该为:8";
					return false;
				}
				break;
			case 5:
				if (c != 7) {
					error.innerHTML = "";
					error.innerHTML = "身份证号码校验位错:最后一位应该为:7";
					return false;
				}
				break;
			case 6:
				if (c != 6) {
					error.innerHTML = "";
					error.innerHTML = "身份证号码校验位错:最后一位应该为:6";
					return false;
				}
				break;
			case 7:
				if (c != 5) {
					error.innerHTML = "";
					error.innerHTML = "身份证号码校验位错:最后一位应该为:5";
					return false;
				}
				break;
			case 8:
				if (c != 4) {
					error.innerHTML = "";
					error.innerHTML = "身份证号码校验位错:最后一位应该为:4";
					return false;
				}
				break;
			case 9:
				if (c != 3) {
					error.innerHTML = "";
					error.innerHTML = "身份证号码校验位错:最后一位应该为:3";
					return false;
				}
				break;
			case 10:
				if (c != 2) {
					error.innerHTML = "";
					error.innerHTML = "身份证号码校验位错:最后一位应该为:2";
					return false;
				}
			}
		} else {//15位身份证号  
			if (!isNumber(StrNo)) {
				error.innerHTML = "";
				error.innerHTML = "身份证号码错误,前15位不能含有英文字母!";
				return false;
			}
		}
		return true;

	}
	/**
	 * 验证身份证件中的日期是否合法有效
	 * @param iY
	 * @param iM
	 * @param iD
	 * @param _id
	 * @return
	 */
	function isValidDate(iY, iM, iD, _id) {
		if (iY > 2200 || iY < 1900 || !isNumber(iY)) {
			document.getElementById(_id).innerHTML = "";
			document.getElementById(_id).innerHTML = "输入身份证号,年度" + iY + "非法!";
			return false;
		}
		if (iM > 12 || iM <= 0 || !isNumber(iM)) {
			document.getElementById(_id).innerHTML = "";
			document.getElementById(_id).innerHTML = "输入身份证号,月份" + iM + "非法!";
			return false;
		}
		if (iD > 31 || iD <= 0 || !isNumber(iD)) {
			document.getElementById(_id).innerHTML = "";
			document.getElementById(_id).innerHTML = "输入身份证号,日期" + iD + "非法!";
			return false;
		}
		return true;
	}
	/**
	 * 验证是否为数字
	 * @param oNum
	 * @return
	 */
	function isNumber(oNum) {
		if (!oNum)
			return false;
		var strP = /^\d+(\.\d+)?$/;
		if (!strP.test(oNum))
			return false;
		try {
			if (parseFloat(oNum) != oNum)
				return false;
		} catch (ex) {
			return false;
		}
		return true;
	}

 注:关于银行卡号的校验 有什么更好的方法 请提出来 供大家研究 谢谢

分享到:
评论
1 楼 piaoxue_x 2011-08-03  
嗯,好,不错,谢谢了!!!

相关推荐

Global site tag (gtag.js) - Google Analytics