Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Алгоритм проверки контрольного числа номера карточки пенсионного страхования
 
 автор: Любовь   (13.04.2011 в 12:58)   письмо автору
 
 

Алгоритм проверки контрольного числа КАРТОЧКИ ПЕНСИОННОГО СТРАХОВАНИЯ:
Номер карточки пенсионного страхования (он же СНИЛС) проверяется на валидность контрольным числом. СНИЛС имеет вид: «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 - указано верно.

  Ответить  
 
 автор: cheops   (13.04.2011 в 13:50)   письмо автору
 
   для: Любовь   (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($number09);
  
// Проверяем можно ли подсчитывать
  // контрольную сумму
  
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 
"Контрольное число не корректное";
?>

  Ответить  
 
 автор: Любовь   (13.04.2011 в 17:17)   письмо автору
 
   для: cheops   (13.04.2011 в 13:50)
 

А как сделать, чтобы номер карточки пенсионного страхования вводился с клавиатуры?

  Ответить  
 
 автор: cheops   (13.04.2011 в 17:39)   письмо автору
 
   для: Любовь   (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($number09); 
    
// Проверяем можно ли подсчитывать 
    // контрольную сумму 
    
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>

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования