/**
* 2017版
* 731算法-加权因子
*/
private static int[] WEIGHTS = { 7, 3, 1, 7, 3, 1, 7, 3, 1, 7, 3, 1, 7, 3 };
/**
* 2017版(15位)
* 校验外国人永久居留证
*
* @param foreignerIdCard 外国人永久居留证
* @return 是否符合2017版外国人永久居留证规则
*/
public static bool ValidCard15ByForeigner(string foreignerIdCard)
{
if (string.IsNullOrEmpty(foreignerIdCard))
{
return false;
}
// 校验长度、前三位是否为大写字母、后12位是否为数字
if (!Regex.IsMatch(foreignerIdCard, "[A-Z]{3}[0-9]{12}"))
{
return false;
}
// 除最后一位外都为计算位数
int length = 15 - 1;
// 本体码
int[] a = new int[length];
// 乘积
int[] product = new int[length];
for (int i = length; i > 0; i--)
{
// 前三位为大写字母,映射为10-35的十进制数字
if (i > length - 3)
{
a[length - i] = MapLetterToNumber(foreignerIdCard[length - i]);
}
else
{
a[length - i] = foreignerIdCard[length - i] - '0';
}
// 乘积
product[length - i] = a[length - i] * WEIGHTS[length - i];
}
// 乘积之和对10取模
int modulus = product.Sum() % 10;
// 最后一位为校验码
int checkDigit = foreignerIdCard[length] - '0';
// 校验码与计算得到结果比对
return modulus == checkDigit;
}
/**
* 2017版
* 证件前三位拉丁字母映射为10-35的十进制数字
* 字母转数字
*
* @param letter 单个拉丁字母
* @return 数字
*/
private static int MapLetterToNumber(char letter)
{
return letter - 'A' + 10;
}
外国人永久居留身份证15位校验c#版
最新推荐文章于 2023-12-19 09:36:03 发布