Ниже приведен код проверки достоверности с использованием JS в соответствии с правилами кодирования идентификатора.
Код idcard-validate.js выглядит следующим образом:
Кода -копия выглядит следующим образом:
/**
* 15-битные правила кодирования для удостоверения личности: Dddddd yymmdd xx p
* DDDDDD: региональный код
* yymmdd: дата рождения
* xx: кодирование последовательного класса, не может быть определена
* P: Пол, нечетные числа - мужские, четные цифры - женские
* <p />
* 18-битный кодирование правил для удостоверения личности: dddddd yyyymmdd xxx y
* DDDDDD: региональный код
* yyyymmdd: дата рождения
* xxx: кодирование типа последовательности, нельзя определить, нечетные числа являются мужчинами, даже числа - женщины
* y: проверьте код, значение этой цифры может быть получено через первые 17 цифр
* <p />
* Весовой коэффициент 18-значного числа составляет (справа слева) WI = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]
* Бит проверки y = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2]
* Формула расчета для проверки бита: y_p = mod (∑ (ai × wi), 11)
* I - 2 ... 18 цифр идентификационного номера справа налево;
*
*/
var wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1, 1]; // весовой коэффициент
var validecode = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2]; // Значение бита проверки идентификационной карты.10 представляет x
функция idcardvalidate (idcard) {
idcard = trim (idcard.replace ( / / g, ""));
if (idcard.length == 15) {
вернуть isvalitybrithby15idcard (idcard);
} else if (idcard.length == 18) {
var a_idcard = idcard.split (""); // Получить массив идентификационных карт
if (isvalitybrithby18idcard (idcard) && istruevalidateCodeby18idcard (a_idcard)) {
вернуть истину;
}еще {
вернуть ложь;
}
} еще {
вернуть ложь;
}
}
/**
* Определите, является ли последнее бит проверки правильным, когда идентификационный номер составляет 18 цифр.
* @param a_idcard идентификационные номера массив
* @возвращаться
*/
Функция iStrueValidateCodeby18idcard (a_idcard) {
var sum = 0;
if (a_idcard [17] .tolowercase () == 'x') {
A_IDCARD [17] = 10; // Заменить код проверки на последний бит x на 10 для последующих операций
}
для (var i = 0; i <17; i ++) {
sum += wi [i] * a_idcard [i]; // взвешенная сумма
}
valcodeposition = sum % 11; // где получить код проверки
if (a_idcard [17] == validecode [valcodeposition]) {
вернуть истину;
} еще {
вернуть ложь;
}
}
/**
*Судите, является ли это мужчиной или женщиной через удостоверение личности
* @param idcard 15/18-значный идентификационный номер
* @return 'Женщина-фемейл, «мужчина»
*/
Функция maleorfemalbyidcard (idcard) {
idcard = trim (idcard.replace (// g, "")); // обработать идентификационный номер. В том числе пробелы между персонажами.
if (idcard.length == 15) {
if (idcard.substring (14,15)%2 == 0) {
вернуть «женщину»;
}еще{
вернуть «мужчина»;
}
} else if (idcard.length == 18) {
if (idcard.substring (14,17)%2 == 0) {
вернуть «женщину»;
}еще{
вернуть «мужчина»;
}
}еще{
вернуть ноль;
}
// входящие символы могут быть обработаны непосредственно как массив
// if (idcard.length == 15) {
// предупреждение (idcard [13]);
// if (idcard [13]%2 == 0) {
// вернуть «женщину»;
// }еще{
// вернуть «мужчина»;
//}
//} else if (idcard.length == 18) {
// предупреждение (idcard [16]);
// if (idcard [16]%2 == 0) {
// вернуть «женщину»;
// }еще{
// вернуть «мужчина»;
//}
// }еще{
// вернуть NULL;
//}
}
/**
* Убедитесь, является ли день рождения на 18-значном идентификационном номере действительным днем рождения
* @param idcard 18-битная идентификационная строка книги
* @возвращаться
*/
функция isValitybrithby18idcard (idcard18) {
var Year = idcard18.substring (6,10);
var month = idcard18.substring (10,12);
var day = idcard18.substring (12,14);
var temp_date = новая дата (год, parsefloat (месяц) -1, parsefloat (день));
// Использовать electielyear () здесь, чтобы получить год, чтобы избежать проблемы тысячелетий.
if (temp_date.getfyear ()! = parsefloat (год)
|| temp_date.getmonth ()! = parsefloat (месяц) -1
|| temp_date.getDate ()! = parsefloat (day)) {
вернуть ложь;
}еще{
вернуть истину;
}
}
/**
* Убедитесь, является ли день рождения на 15-значном идентификационном номере действительным днем рождения
* @param idcard15 15-битная строка идентификатора книги
* @возвращаться
*/
функция isValitybrithby15idcard (idcard15) {
var Year = idcard15.substring (6,8);
var month = idcard15.substring (8,10);
var day = idcard15.substring (10,12);
var temp_date = новая дата (год, parsefloat (месяц) -1, parsefloat (день));
// Для вашего возраста в вашем старом удостоверении личности вам не нужно рассматривать проблему червя тысячелетия и использовать метод getyear ()
if (temp_date.getyear ()! = parsefloat (год)
|| temp_date.getmonth ()! = parsefloat (месяц) -1
|| temp_date.getDate ()! = parsefloat (day)) {
вернуть ложь;
}еще{
вернуть истину;
}
}
// Удалить струнную головку и хвостовые пространства
функция Trim (str) {
return str.replace (/(^/s*) | (/s*$)/g, "");
}
Обновленная версия 2
Кода -копия выглядит следующим образом:
Function CheckIdcard (num)
{
num = num.touppercase ();
// Номер идентификатора составляет 15 или 18 цифр.
if (! (/(^/d {15} $) | (^/d {17} ([0-9] | x) $)/. test (num)))))))))))))))))))))))))))
{
// alert («длина введенного идентификационного номера неверна, или число не соответствует требованиям! /N15-цифры, которые должны быть все числа, а последнее 18-значное число может быть числами или X. ');
вернуть ложь;
}
// Чек бит генерируется в соответствии с положениями ISO 7064: 1983. MOD 11-2, а X можно рассматривать как число 10.
// Следующие анализируют дату рождения и проверки цифр соответственно
var Len, re;
len = num.length;
if (len == 15)
{
re = new regexp (/^(/d {6}) (/d {2}) (/d {2}) (/d {2}) (/d {2}) (/d {3}) $ /);
var arrsplit = num.match (re);
// проверьте, верна ли дата дня рождения
var dtmbirth = новая дата ('19 ' + arrsplit [2] +'/' + arrsplit [3] +'/' + arrsplit [4]);
var bgoodday;
bgoodday = (dtmbirth.getyear () == number (arrsplit [2])) && ((dtmbirth.getmonth () + 1) == number (arrsplit [3])) && (dtmbirth.getdate () == n umber (arrsplit [4]));
if (! bgoodday)
{
// предупреждение («Дата рождения в введенном идентификационном номере неверна!»);
вернуть ложь;
}
еще
{
// конвертировать 15-значную идентификационную карту в 18-значный
// Чек бит генерируется в соответствии с положениями ISO 7064: 1983. MOD 11-2, а X можно рассматривать как число 10.
var arrint = новый массив (7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 2);
var arrch = new Array ('1', '0', 'x', '9', '8', '7', '6', '5', '4', '3', '2') ;
var ntemp = 0, i;
num = num.substr (0, 6) + '19' + num.substr (6, num.length - 6);
для (i = 0; i <17; i ++)
{
ntemp += num.substr (i, 1) * arrint [i];
}
num += arch [ntemp % 11];
вернуть истину;
}
}
if (len == 18)
{
re = new regexp (/^(/d {6}) (/d {4}) (/d {2}) (/d {2}) (/d {3}) ([0-9] | x ) $/);
var arrsplit = num.match (re);
// проверьте, верна ли дата дня рождения
var dtmbirth = новая дата (arrsplit [2] + "/" + arrsplit [3] + "/" + arrsplit [4]);
var bgoodday;
bgoodday = (dtmbirth.getbleear () == number (arrsplit [2])) && ((dtmbirth.getmonth () + 1) == number (arrsplit [3]))) && (dtmbirth.getDate () == № arrsplit [4]));
if (! bgoodday)
{
// alert (dtmbirth.getyear ());
// предупреждение (arrsplit [2]);
// предупреждение («Дата рождения в введенном идентификационном номере неверна!»);
вернуть ложь;
}
еще
{
// Проверьте, является ли код проверки 18-значной идентификационной карты правильным.
// Чек бит генерируется в соответствии с положениями ISO 7064: 1983. MOD 11-2, а X можно рассматривать как число 10.
var valnum;
var arrint = новый массив (7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 2);
var arrch = new Array ('1', '0', 'x', '9', '8', '7', '6', '5', '4', '3', '2') ;
var ntemp = 0, i;
для (i = 0; i <17; i ++)
{
ntemp += num.substr (i, 1) * arrint [i];
}
valnum = arch [ntemp % 11];
if (valnum! = num.substr (17, 1))
{
// alert ('код проверки 18-битной идентификационной карты неверен! Это должно быть:' + valnum);
вернуть ложь;
}
вернуть истину;
}
}
вернуть ложь;
}