|
|
|
| Алгоритм проверки контрольного числа КАРТОЧКИ ПЕНСИОННОГО СТРАХОВАНИЯ:
Номер карточки пенсионного страхования (он же СНИЛС) проверяется на валидность контрольным числом. СНИЛС имеет вид: «XXX-XXX-XXX YY», где XXX—XXX-XXX — собственно номер, а YY — контрольное число.
Проверка контрольного числа Страхового номера проводится только для номеров больше номера 001—001-998
Контрольное число СНИЛС рассчитывается следующим образом:
1. Каждая цифра СНИЛС умножается на номер своей позиции (позиции отсчитываются с конца)
2. Полученные произведения суммируются
3. Если сумма меньше 100, то контрольное число равно самой сумме
4. Если сумма равна 100 или 101, то контрольное число равно 00
5. Если сумма больше 101, то сумма делится нацело на 101 и контрольное число определяется остатком от деления аналогично пунктам 3 и 4.
Конкретные примеры:
Указан СНИЛС 112-233-445 95
Проверяем правильность контрольного числа:
цифры номера 1 1 2 2 3 3 4 4 5
номер позиции 9 8 7 6 5 4 3 2 1
Сумма = 1х9 + 1х8 + 2х7 + 2х6 + 3х5 + 3х4 + 4х3 + 4х2 + 5х1 = 95
95 / !101! =95
Контрольное число 95 - указано верно. | |
|
|
|
|
|
|
|
для: Любовь
(13.04.2011 в 12:58)
| | Можно поступить следующим образом
<?php
// Номер карточки пенсионного страхования
$number = "112-233-445 95";
// Удаляем тире и пробелы
$number = str_replace(array(" ", "-"),
array("", ""),
$number);
echo "Исходный номер $number<br>";
// Контрольная сумма
$control = substr($number, -2);
// Число
$number = substr($number, 0, 9);
// Проверяем можно ли подсчитывать
// контрольную сумму
if($number < "001001998")
{
exit("Подсчет контрольной суммы производить нельзя");
}
// Вычисляем контрольную сумму
$result = 0;
$total = strlen($number);
for($i = 0; $i < $total; $i++)
{
$result += ($total - $i) * $number[$i];
}
// Корректируем контрольное число
if($result == 100 || $result == 101) $result = "00";
if($result > 101) $result %= 101;
// Проверчем контрольное число
if($result == $control) echo "Контрольное число корректное";
else echo "Контрольное число не корректное";
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(13.04.2011 в 13:50)
| | А как сделать, чтобы номер карточки пенсионного страхования вводился с клавиатуры? | |
|
|
|
|
|
|
|
для: Любовь
(13.04.2011 в 17:17)
| | Можно преобразовать скрипт следующим образом
<?php
if(!empty($_POST))
{
// Массив сообщений об ошибках
$error = array();
// Удаляем тире и пробелы
$number = str_replace(array(" ", "-"),
array("", ""),
$_POST['number']);
$pattern = "|^\d{11}$|";
if(!preg_match($pattern, $number))
{
$error[] = "Введите число, содержащее 11 символов";
}
// Контрольная сумма
$control = substr($number, -2);
// Число
$number = substr($number, 0, 9);
// Проверяем можно ли подсчитывать
// контрольную сумму
if($number < "001001998")
{
$error[] = "Подсчет контрольной суммы производить нельзя";
}
// Если ошибок нет, вычисляем контрольную сумму
if(empty($error))
{
// Вычисляем контрольную сумму
$result = 0;
$total = strlen($number);
for($i = 0; $i < $total; $i++)
{
$result += ($total - $i) * $number[$i];
}
// Корректируем контрольное число
if($result == 100 || $result == 101) $result = "00";
if($result > 101) $result %= 101;
// Проверчем контрольное число
if($result == $control) echo "Контрольное число корректное";
else echo "Контрольное число не корректное";
}
// Если есть ошибки выводим их
echo "<div style='color:red'>";
echo implode("<br>", $error);
echo "</div>";
}
?>
<form method='post' action=''>
<input type='text' name='number' value='<?php echo htmlspecialchars($_POST['number'], ENT_QUOTES); ?>' />
<input type='submit' value='Обработать'>
</form>
|
| |
|
|
|