验证13位南非身份证:字符长度校验代码问题排查
问题排查:13位ID校验代码失效的原因与修复方案
咱们先揪出代码里的核心问题——你的校验逻辑存在逻辑矛盾,这直接导致校验完全不起作用!
原代码的致命错误
你写的判断条件:
if ((ID.length() < 12) && (ID.length() > 12)) { ... }
这里用了&&(逻辑与),要求两个条件同时成立。但想想看:一个字符串的长度怎么可能同时小于12又大于12?这个条件永远是false,所以错误提示永远不会触发,校验等于形同虚设。
修复方案
我们需要把条件改成“长度不等于13”,有两种等价写法:ID.length() != 13 或者 ID.length() < 13 || ID.length() > 13。同时还要注意ID的类型处理(如果需要保留前导零,推荐用字符串处理):
方案1:用字符串处理(推荐,保留前导零)
如果你的ID可能包含前导零(比如0001234567890),用字符串读取能完整保留格式:
// 先读取字符串形式的ID String ID = ReceiveNumbers.next(); if (ID.length() != 13) { System.out.println("Please enter a valid 13 character ID"); // 循环读取直到输入正确 do { ID = ReceiveNumbers.next(); } while (ID.length() != 13); // 如需转成long类型再处理 long myId = Long.parseLong(ID); }
方案2:用long类型处理(注意丢失前导零)
如果ID没有前导零,坚持用long类型的话,需要把long转成字符串判断长度:
long myId = ReceiveNumbers.nextLong(); String IDStr = String.valueOf(myId); if (IDStr.length() != 13) { System.out.println("Please enter a valid 13 character ID"); // 循环读取直到输入正确 do { myId = ReceiveNumbers.nextLong(); IDStr = String.valueOf(myId); } while (IDStr.length() != 13); }
额外提醒
- 如果你用
nextLong()读取,要注意用户输入非数字时会抛出InputMismatchException,可以加异常处理增强健壮性。 - 13位数字在long的取值范围内(long最大支持19位数字),所以转类型不会有溢出问题。
内容的提问来源于stack exchange,提问作者Mode
相关产品推荐
相关产品推荐

