Проверка СНИЛС с помощью JavaScript

Сейчас всё чаще и чаще для доступа к сайтам как-либо связанным с государством требуется вспоминать свой номер страхового свидетельства, он же СНИЛС. Номер этот можно проверить на корректность, также как и ИНН и ОГРН.

Формула проверки очень простая: берём первые девять цифр высчитываем сумму всех произведений каждой цифры на номер с конца. Т.е. первую цифру умножаем на 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 вообще тривиальная задача, если кому понадобится и он не догадается как это делать — могу выложить.

5 комментариев

Ru5

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);
}

Ответить

Ваш отзыв

logo