Данный функционал(с возможными незначительными изменениями) добавлен в библиотеку Net.KSUniLib с версии 1.0.3.38.
Namespace: KomeSoftUniCL.Tools
Class: KSNumberValidator
В базы данных операторами часто вводятся различные текстово-цифровые коды, номера и идентификаторы. Каждый номер или идентификатор, как правило, имеет в своем составе специальные контрольные разряды и алгоритмы проверки правильности ввода. С одним из таких алгоритмов мы сегодня и познакомимся. А проверять мы будем СНИЛС. Да-да, ту самую зеленую карточку, которая лежит у вас в паспорте. СНИЛС в России выступает аналогом карточки соцстрахования в Штатах.
Фактически СНИЛС представляет собой три группы по три цифры, и отдельную группу на два символа для контрольного числа. Контрольное число рассчитывается по следующему алгоритму:
0) Игнорируются все нецифровые символы.
1) Все цифры СНИЛС (т.е., 9 цифр основного номера без контрольного числа) умножаются на свою позицию в номере (Важно: позиции цифр рассчитываются как в числе, а не как в строке! Т.е., справа налево. Важно: счет позиций начинается с 1, а не с 0)
2) Произведения разрядов номера суммируются.
3) Если сумма меньше 100, она принимается за контрольную.
4) Если сумма - 100 или 101, то контрольной суммой становится ноль. В номере при этом записывается "00"
5) Если сумма больше 101, то она делится нацело на 101, а с остатком от деления повторяются шаги с 3 по 5.
Дабы не реализовывать каждый раз функционал различных проверок, я создал в библиотеке специальный статический класс, и по мере сил и времени буду добавлять туда новые виды проверок. А на проверке номера СНИЛС и расчете его контрольной суммы мы сейчас остановимся поподробнее.
Итак, нам необходимы три метода: метод SNILSValidate(), возвращающий только true и false в зависимости от того, валидный ли номер или нет, метод SNILSContolCalc(), рассчитывающий и возвращающий контрольную сумму в виде числа и приватный метод SNILSCheckControlSum(), выполняющий указанные чуть выше шаги сравнения.
Реализуем SNILSValidate():
Логика метода проста. Метод получает строку, содержащую (предположительно) СНИЛС. Далее, с помощью KSStringProcessor.OnlyDigits(), мы очищаем входную строку от всего, кроме цифр, и проверяем ее длину. Если длина строки - 9 символов, то она является номером СНИЛС без контрольной суммы, если 11 - то приведен номер СНИЛС с контрольной суммой, а при любой другой длине строки метод выбрасывает исключение.
Итак, как мы видим, при длине строки в 9 символов для валидации нам достаточно просто рассчитать контрольную сумму. Если она рассчиталась, то номер мы считаем валидным.
При длине строки в 11 символов действия немного сложнее - необходимо запомнить последние два символа, рассчитать контрольную сумму для оставшихся 9 символов, а затем сравнить два значения. Если они равны, то номер валиден.
Теперь необходимо реализовать функционал расчета контрольной суммы:
Данный метод мы можем применять как вместе с предыдущим, так и независимо от него. Поэтому мы должны в него встроить не же проверки на длину строки. Далее, с помощью цикла for с двумя индексами i и j мы обходим посимвольно полученный 9-ти значный номер, и рассчитаем общую сумму разрядов.
Остался последний метод - SNILSCheckControlSum():
Метод определяет, в какой диапазон входит totalSum, и если она входит в третий диапазон - делит ее нацело на 101 и вызывает сама себя.
Результат: методы проверяют введенный номер СНИЛС на валидность и рассчитывают его контрольную сумму. Чуть позже будут так же написаны методы для проверки штрих-кодов EAN-8 и EAN-13, а также для ИНН и ОГРН.
Namespace: KomeSoftUniCL.Tools
Class: KSNumberValidator
В базы данных операторами часто вводятся различные текстово-цифровые коды, номера и идентификаторы. Каждый номер или идентификатор, как правило, имеет в своем составе специальные контрольные разряды и алгоритмы проверки правильности ввода. С одним из таких алгоритмов мы сегодня и познакомимся. А проверять мы будем СНИЛС. Да-да, ту самую зеленую карточку, которая лежит у вас в паспорте. СНИЛС в России выступает аналогом карточки соцстрахования в Штатах.
Фактически СНИЛС представляет собой три группы по три цифры, и отдельную группу на два символа для контрольного числа. Контрольное число рассчитывается по следующему алгоритму:
0) Игнорируются все нецифровые символы.
1) Все цифры СНИЛС (т.е., 9 цифр основного номера без контрольного числа) умножаются на свою позицию в номере (Важно: позиции цифр рассчитываются как в числе, а не как в строке! Т.е., справа налево. Важно: счет позиций начинается с 1, а не с 0)
2) Произведения разрядов номера суммируются.
3) Если сумма меньше 100, она принимается за контрольную.
4) Если сумма - 100 или 101, то контрольной суммой становится ноль. В номере при этом записывается "00"
5) Если сумма больше 101, то она делится нацело на 101, а с остатком от деления повторяются шаги с 3 по 5.
Дабы не реализовывать каждый раз функционал различных проверок, я создал в библиотеке специальный статический класс, и по мере сил и времени буду добавлять туда новые виды проверок. А на проверке номера СНИЛС и расчете его контрольной суммы мы сейчас остановимся поподробнее.
Итак, нам необходимы три метода: метод SNILSValidate(), возвращающий только true и false в зависимости от того, валидный ли номер или нет, метод SNILSContolCalc(), рассчитывающий и возвращающий контрольную сумму в виде числа и приватный метод SNILSCheckControlSum(), выполняющий указанные чуть выше шаги сравнения.
Реализуем SNILSValidate():
public Boolean SNILSValidate(String snils){
String workSnils = KSStringProcessor.OnlyDigits(snils);
Boolean result = false;
if(workSnils.Length == 9){
if(SNILSContolCalc(workSnils) > -1){
result = true;
}
}
else if(workSnils.Length == 11){
Int32 controlSum = SNILSContolCalc(workSnils);
Int32 strControlSum = Int32.Parse(workSnils.Substring(9, 2));
if(controlSum == strControlSum){
result = true;
}
}
else{
throw new Exception(String.Format("Incorrect SNILS number. {0} digits! (it can only be 9 or 11 digits!)", workSnils.Length));
}
return result;
}
Логика метода проста. Метод получает строку, содержащую (предположительно) СНИЛС. Далее, с помощью KSStringProcessor.OnlyDigits(), мы очищаем входную строку от всего, кроме цифр, и проверяем ее длину. Если длина строки - 9 символов, то она является номером СНИЛС без контрольной суммы, если 11 - то приведен номер СНИЛС с контрольной суммой, а при любой другой длине строки метод выбрасывает исключение.
Итак, как мы видим, при длине строки в 9 символов для валидации нам достаточно просто рассчитать контрольную сумму. Если она рассчиталась, то номер мы считаем валидным.
При длине строки в 11 символов действия немного сложнее - необходимо запомнить последние два символа, рассчитать контрольную сумму для оставшихся 9 символов, а затем сравнить два значения. Если они равны, то номер валиден.
Теперь необходимо реализовать функционал расчета контрольной суммы:
public static Int32 SNILSContolCalc(String snils){
String workSnils = KSStringProcessor.OnlyDigits(snils);
if(workSnils.Length != 9 && workSnils.Length != 11){
throw new Exception(String.Format("Incorrect SNILS number. {0} digits! (it can only be 9 or 11 digits!)", workSnils.Length));
}
if(workSnils.Length == 11){
workSnils = workSnils.Substring(0,9);
}
Int32 totalSum = 0;
for(Int32 i = workSnils.Length-1, j=0;i>=0;i--, j++){
Int32 digit = Int32.Parse(workSnils[i].ToString());
totalSum += digit*(j+1);
}
return SNILSCheckControlSum(totalSum);
}
Данный метод мы можем применять как вместе с предыдущим, так и независимо от него. Поэтому мы должны в него встроить не же проверки на длину строки. Далее, с помощью цикла for с двумя индексами i и j мы обходим посимвольно полученный 9-ти значный номер, и рассчитаем общую сумму разрядов.
Остался последний метод - SNILSCheckControlSum():
private static Int32 SNILSCheckControlSum(Int32 _controlSum){
Int32 result;
if(_controlSum < 100){
result = _controlSum;
}
else if(_controlSum <= 101){
result = 0;
}
else{
Int32 balance = _controlSum%101;
result = SNILSCheckControlSum(balance);
}
return result;
}
Метод определяет, в какой диапазон входит totalSum, и если она входит в третий диапазон - делит ее нацело на 101 и вызывает сама себя.
Результат: методы проверяют введенный номер СНИЛС на валидность и рассчитывают его контрольную сумму. Чуть позже будут так же написаны методы для проверки штрих-кодов EAN-8 и EAN-13, а также для ИНН и ОГРН.
Комментариев нет:
Отправить комментарий