台湾身份证校验

本文介绍了一个用于验证台湾身份证号码有效性的算法。该算法首先检查身份证号码的长度和格式,然后通过对照地区代码表来验证地区代码,并检查性别字段的有效性。接下来,通过一系列数学运算验证身份证号码的校验位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

	/**
	 * 校验台湾身份证格式
	 * @param idCard
	 * @return
	 */
	public static boolean TWIDCardValidate(String idCard){
		if (StringUtils.isNotBlank(idCard) && idCard.length() == 10) {
			idCard = idCard.toUpperCase();
			// 第一位验证:第一位是用户所在的地区
			Hashtable<String,Integer> twMap = GetTWAreaCode();
			Integer tw = twMap.get(idCard.substring(0, 1));
			if (tw == null) {
				return false;
			}
			try {
				// 第二位验证:第二位是性别《1:男,2:女》
				int sex = Integer.parseInt(idCard.substring(1, 2));
				if (sex != 1 && sex != 2) {
					return false;
				}
				// 第三位~第九位:顺序码
				// 十位数
				int ten = tw / 10 % 10;
				// 个位数
				int one = tw % 10;

				int totalNumber = ten; // 区域代码的十位数
				totalNumber += one * 9; // 区域代码的个位数 * 9
				totalNumber += sex * 8; // 性别 * 8

				// 以下都是身份证的第3位 ~ 第9位
				int number = 7;
				for (int i = 2; i < 9; i++) {
					if (number < 1) {
						break;
					}
					totalNumber += Integer.parseInt(idCard.substring(i, i + 1)) * number;
					number --;
				}
				String totalNumberStr = totalNumber+"";
				// 第十位:用 10 减去计算和的各位数
				int lastNumber = 10 - Integer.parseInt((totalNumberStr).substring(totalNumberStr.length() - 1));
				lastNumber = lastNumber == 10 ? 0 : lastNumber;
				if (lastNumber == Integer.parseInt(idCard.substring(9))) {
					return true;
				}
			} catch (NumberFormatException e) {
				e.printStackTrace();
			}
		}
		return false;
	}

	private static Hashtable<String, Integer> GetTWAreaCode() {
		Hashtable<String, Integer> hashtable = new Hashtable<String, Integer>();
		hashtable.put("A", 10);//台北市
		hashtable.put("B", 11);//台中市
		hashtable.put("C", 12);//基隆市
		hashtable.put("D", 13);//台南市
		hashtable.put("E", 14);//高雄市
		hashtable.put("F", 15);//新北市
		hashtable.put("G", 16);//宜兰县
		hashtable.put("H", 17);//桃园市
		hashtable.put("J", 18);//新竹县
		hashtable.put("K", 19);//苗栗县
		hashtable.put("L", 20);//台中县
		hashtable.put("M", 21);//南投县
		hashtable.put("N", 22);//彰化县
		hashtable.put("P", 23);//云林县
		hashtable.put("Q", 24);//嘉义县
		hashtable.put("R", 25);//台南县
		hashtable.put("S", 26);//高雄县
		hashtable.put("T", 27);//屏东县
		hashtable.put("U", 28);//花莲县
		hashtable.put("V", 29);//台东县
		hashtable.put("X", 30);//澎湖县
		hashtable.put("Y", 31);//阳明山
		hashtable.put("W", 32);//金门县
		hashtable.put("Z", 33);//连江县
		hashtable.put("I", 34);//嘉义市
		hashtable.put("O", 35);//新竹市
		return hashtable;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值