flutter如何校验身份证号

在Flutter中,如何正确校验中国大陆的身份证号码?需要实现以下功能:

  1. 验证身份证号长度(15位或18位)
  2. 校验出生日期是否合法
  3. 验证最后一位校验码是否正确(针对18位身份证)
  4. 最好能支持同时校验15位和18位身份证号 请问有没有现成的Dart包可以实现这个功能?或者需要自己编写校验算法?
2 回复

在Flutter中校验身份证号,可以通过正则表达式和校验位算法实现:

  1. 正则匹配格式(18位):
bool validateFormat(String idCard) {
  return RegExp(r'^\d{17}[\dXx]$').hasMatch(idCard);
}
  1. 校验位验证
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];
}
  1. 完整校验
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
}

校验说明:

  1. 格式检查:使用正则验证15位全数字或18位(最后一位可为X)
  2. 15位身份证:仅验证出生日期有效性
  3. 18位身份证
    • 计算前17位与加权因子的乘积和
    • 取模后对照校验码表验证最后一位

此方法覆盖了身份证号的基本校验需求,实际应用中可根据需要补充地区码验证等功能。

回到顶部