С 1 июля 2016 года вроде как уже должна быть внедрена отправка данных в ГИС ЖКХ для организаций, осуществляющих прием платежей за ЖКХ, согласно приказу Минкомсвязи России № 589, Минстроя России № 944/пр от 28.12.2015 "Об утверждении порядка и способов размещения информации". Идея хорошая, а реализация какой будет - посмотрим. Пока что вот реализация алгоритма проверки контрольного разряда Единого лицевого счета (далее ЕЛС).
Описание алгоритма можно найти на http://dom.gosuslugi.ru/#/regulations?userCtgrCode=1 документ называется Алгоритм проверки контрольного разряда ЕЛС, а вот этот Структура идентификаторов в ГИС ЖКХ смотреть не надо, он уже устарел, там неправильный пример ЕЛС (75да533315) и неверная оценка общего количества идентификаторов (7 млрд).
Описание алгоритма можно найти на http://dom.gosuslugi.ru/#/regulations?userCtgrCode=1 документ называется Алгоритм проверки контрольного разряда ЕЛС, а вот этот Структура идентификаторов в ГИС ЖКХ смотреть не надо, он уже устарел, там неправильный пример ЕЛС (75да533315) и неверная оценка общего количества идентификаторов (7 млрд).
Я скопирую правильный на текущий момент текст сюда на всякий случай:
Алгоритм проверки контрольного разряда ЕЛС
Система формирует строку длиной 10 символов, содержащую:
1-ый разряд (контрольная сумма) не заполняется;
2-ой разряд – содержит только цифры «0»-«9»;
3-ий и 4-ый разряды – используются только следующие кириллические символы: «А», «В», «Е», «К», «М», «Н», «О», «Р», «С», «Т», «У», «Х»;
С 5-го по 10-ый разряды – содержит только цифры «0»-«9».
Алгоритм проверки контрольного разряда ЕЛС
Система формирует строку длиной 10 символов, содержащую:
1-ый разряд (контрольная сумма) не заполняется;
2-ой разряд – содержит только цифры «0»-«9»;
3-ий и 4-ый разряды – используются только следующие кириллические символы: «А», «В», «Е», «К», «М», «Н», «О», «Р», «С», «Т», «У», «Х»;
С 5-го по 10-ый разряды – содержит только цифры «0»-«9».
- Каждый кириллический символ из ЕЛС должен быть приведен к числовому виду, для этого необходимо код символа в кодировке UTF-8 перевести из двоичного представления в десятичное;
- Каждая цифра из ЕЛС или число, соответствующее кириллическому символу из ЕЛС, умножается на номер своей позиции в номере ЕЛС, при этом позиции отсчитываются с конца номера – справа налево;
- Полученные произведения суммируются;
- Полученная сумма делится на 10;
Хотя бы в этот раз они не сделали смесь русских и английских букв, как в номерах штрафов ГИБДД. Но все равно, наличие букв непонятно, их всего 12, и дает минимальное увеличение номерной емкости по сравнению с цифрами.
Процедура проверки контрольного разряда ЕЛС на java
public static boolean checkELS(String els) { if (els == null || els.length() != 10) { return false; } if (!StringUtils.containsOnly(els.substring(2, 4), "ХАКЕРСТВОМНУ")) { // АВЕКМНОРСТУХ logger.debug("wrong symbols in positions 2-3"); return false; } if (!StringUtils.isNumeric(els.substring(0, 2)) || !StringUtils.isNumeric(els.substring(4))) { logger.debug("non-numeric symbol"); return false; } int sum = 0; for (int i = 1; i < els.length(); i++) { if (i == 2 || i == 3) { sum += els.codePointAt(i) * (els.length() - i); } else { sum += Integer.parseInt(els.substring(i, i + 1)) * (els.length() - i); } } return sum % 10 == Integer.parseInt(els.substring(0, 1)); }
номер для проверки: 50АА007748
можно конечно проверки делать с помощью regexp вида ^\d{2}[АВЕКМНОРСТУХ]{2}\d{6}$