flutter如何校验身份证号
在Flutter中,如何正确校验中国大陆的身份证号码?需要实现以下功能:
- 验证身份证号长度(15位或18位)
- 校验出生日期是否合法
- 验证最后一位校验码是否正确(针对18位身份证)
- 最好能支持同时校验15位和18位身份证号 请问有没有现成的Dart包可以实现这个功能?或者需要自己编写校验算法?
2 回复
在Flutter中校验身份证号,可以通过正则表达式和校验位算法实现:
- 正则匹配格式(18位):
bool validateFormat(String idCard) {
return RegExp(r'^\d{17}[\dXx]$').hasMatch(idCard);
}
- 校验位验证:
bool validateCheckCode(String idCard) {
List<int> coefficients = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
List<String> codes = ['1','0','X','9','8','7','6','5','4','3','2'];
int sum = 0;
for (int i = 0; i < 17; i++) {
sum += int.parse(idCard[i]) * coefficients[i];
}
return idCard[17].toUpperCase() == codes[sum % 11];
}
- 完整校验:
bool validateIdCard(String idCard) {
return idCard.length == 18 &&
validateFormat(idCard) &&
validateCheckCode(idCard);
}
注意:实际使用还需验证生日字段的合法性,可使用DateTime.tryParse()解析生日部分(如idCard.substring(6,14))进行日期验证。
更多关于flutter如何校验身份证号的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在 Flutter 中校验身份证号,可以通过正则表达式和算法规则实现。以下是完整的校验方法,包括格式检查和校验码验证:
bool validateIDCard(String idCard) {
// 正则表达式:检查15位或18位身份证格式
RegExp regExp = RegExp(r'^\d{15}|\d{17}[\dXx]$');
if (!regExp.hasMatch(idCard)) {
return false;
}
// 15位身份证(仅检查格式)
if (idCard.length == 15) {
return _validate15DigitIDCard(idCard);
}
// 18位身份证(完整校验)
if (idCard.length == 18) {
return _validate18DigitIDCard(idCard);
}
return false;
}
bool _validate15DigitIDCard(String idCard) {
// 15位身份证简单校验:出生日期
try {
String birthday = '19${idCard.substring(6, 12)}';
DateTime birthDate = DateTime.parse(
'${birthday.substring(0, 4)}-${birthday.substring(4, 6)}-${birthday.substring(6, 8)}');
return birthDate.isBefore(DateTime.now());
} catch (e) {
return false;
}
}
bool _validate18DigitIDCard(String idCard) {
// 校验码验证
List<int> factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
List<String> checksums = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
int sum = 0;
for (int i = 0; i < 17; i++) {
sum += int.parse(idCard[i]) * factors[i];
}
int remainder = sum % 11;
String expectedChecksum = checksums[remainder];
return idCard[17].toUpperCase() == expectedChecksum;
}
使用示例:
void main() {
String idCard = '11010519491231002X';
bool isValid = validateIDCard(idCard);
print('身份证号是否有效: $isValid'); // 输出:身份证号是否有效: true
}
校验说明:
- 格式检查:使用正则验证15位全数字或18位(最后一位可为X)
- 15位身份证:仅验证出生日期有效性
- 18位身份证:
- 计算前17位与加权因子的乘积和
- 取模后对照校验码表验证最后一位
此方法覆盖了身份证号的基本校验需求,实际应用中可根据需要补充地区码验证等功能。

