Сейчас всё чаще и чаще для доступа к сайтам как-либо связанным с государством требуется вспоминать свой номер страхового свидетельства, он же СНИЛС. Номер этот можно проверить на корректность, также как и ИНН и ОГРН.>
Формула проверки очень простая: берём первые девять цифр высчитываем сумму всех произведений каждой цифры на номер с конца. Т.е. первую цифру умножаем на 9, вторую на 8 и т.д. Полученную сумму сравниваем с последними двумя цифрами – если совпало – всё правильно. Единственный нюанс это если получилась сумма больше ста, но там надо либо сравнивать с нулём, либо с остатком от деления на 101.
Все эти манипуляции можно записать в одну функцию:
function checkSnils(checkedValue,fieldName){
var checkSum = parseInt(checkedValue.slice(9),10);
//строка как массив(для старых браузеров)
checkedValue = "" + checkedValue;
checkedValue = checkedValue.split('');
var sum = (checkedValue[0]*9 + checkedValue[1]*8 + checkedValue[2]*7 + checkedValue[3]*6 + checkedValue[4]*5 + checkedValue[5]*4 + checkedValue[6]*3 + checkedValue[7]*2 + checkedValue[8]*1);
if(sum < 100 && sum == checkSum){
return true;
}else if((sum == 100 || sum == 101) && checkSum == 0){
return true;
}else if(sum > 101 && (sum%101 == checkSum || (sum%101 == 100 && checkSum == 0))){
return true;
}else{
return false;
}
}
Вот и вся проверка =) Переделать этот же код для php вообще тривиальная задача, если кому понадобится и он не догадается как это делать — могу выложить.
6 комментариев
checkSnils : function(snils) {
if (!snils) {
return true;
}
if (!/^\d{3}-\d{3}-\d{3} \d{2}$/.test(snils)) {
return ‘Формат: XXX-XXX-XXX YY, где XXX-XXX-XXX — собственно номер, а YY — контрольное число.’;
}
var value = » + snils.match(/\d+/g).join(»);
var number = parseInt(value.substring(0, 9));
if (number <= parseInt('001001998')) {
return true;
}
var checkSum = parseInt(value.slice(9), 10);
var digit = value.split('');
var sum = (digit[0] * 9 + digit[1] * 8 + digit[2] * 7 + digit[3] * 6 + digit[4] * 5 + digit[5] * 4 + digit[6] * 3
+ digit[7] * 2 + digit[8] * 1);
if (sum 101 && (sum % 101 == checkSum || (sum % 101 == 100 && checkSum == 0))) {
return true;
} else {
return ‘Контрольное число СНИЛС ошибочно.’;
}
}
Ответить
Скрипт работает не верно
Ответить
Какой снилс не прошел проверку? Данный скрипт работает на боевом проекте и нареканий не вызывает.
Ответить
зачем это (sum % 101 == 100 && checkSum == 0) нужно? как сумма, которая может быть максимально равна 405 (при всех девятках) при % 101 даст в результате 100?
Ответить
суммирование можно как-то «поизящней» что ли было написать:
var sum = 0;
for (var i = 0; i < 9; i++) {
sum += digit[i] * (9 — i);
}
Ответить
Здравствуйте, можете ли Вы выложить код готовой HTML страницы вот с этим скриптом?
Ответить