СНИЛС - проверка корректности
Добавлено: 01 Июль 2018, 9:52
Есть ли у кого-нибудь реализация на кларионе?
Место общения программистов, форум разработчиков БД на Clarion
https://forum.clarionlife.net/
Код: Выделить всё
program
!
! на основе
! https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%BE#%D0%A1%D1%82%D1%80%D0%B0%D1%85%D0%BE%D0%B2%D0%BE%D0%B9_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80_%D0%B8%D0%BD%D0%B4%D0%B8%D0%B2%D0%B8%D0%B4%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BB%D0%B8%D1%86%D0%B5%D0%B2%D0%BE%D0%B3%D0%BE_%D1%81%D1%87%D1%91%D1%82%D0%B0_(%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D1%8F)
!
map
checksnils(string snils),byte
end
CODE
if CheckSnils(deformat('112-233-445 95',@P###-###-### ##P))
message('snils ok')
end
checksnils procedure(string snils)!,byte
c byte
s long
n byte
t long
code
! если не 11 - ошибка
if len(clip(snils)) <> 11
return false
end
! контрольный номер можно проверить только после номера 1001998
t = snils[1:9]
if t <= 1001998
return true
end
! суммируем
loop c = 1 to 9
s += snils[c] * (10-c)
end
! вычисляем контрольный номер
loop
if s < 100
n = s
break
elsif s=100 or s=101
n = 0
break
else
s = s % 101
cycle
end
end
! сверяем
if n = snils[10:11]
return true
end
! ничего не подошло - ошибка
return false