https://iu5bmstu.ru/api.php?action=feedcontributions&user=217.14.52.2&feedformat=atom
Кафедра ИУ5 МГТУ им. Н.Э.Баумана, студенческое сообщество - Вклад [ru]
2024-03-28T18:24:57Z
Вклад
MediaWiki 1.41.0
https://iu5bmstu.ru/index.php?title=FFmpeg_-_%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE&diff=5179
FFmpeg - Работа с видео
2015-06-30T09:35:40Z
<p>217.14.52.2: /* Обрезка (crop) видео */ учимся считать</p>
<hr />
<div>[[Файл:FFmpeg-logo.png|right]]<br />
<br />
[http://ru.wikipedia.org/wiki/FFmpeg FFmpeg] - это программа (набор медиа-библиотек с исполняемым файлом), дающая неограниченную власть над видео и позволяющая сэкономить кучу времени.<br />
<br />
== Описание ==<br />
<br />
Не однажды любой сталкивался с ситуацией, когда надо было:<br />
* разрезать видео на части или наоборот, склеить из двух;<br />
* вырезать звук из клипа, заменить звуковую дорожку в фильме (выкинуть бубляж, вставить оригинал);<br />
* наложить субтитры;<br />
* обрезать по кадру (crop);<br />
* сконвертировать для iPhone/PSP/ещёчо;<br />
* и прочее подобное.<br />
<br />
И каждый раз, можно поспорить, начинались поиски, где бы украсть какой софт, чтобы это сделать. Так вот, всё это умеет делать FFmpeg, который не стоит при этом ни копейки (хотя желательно подкинуть пацанам [http://www.ffmpeg.org/donations.html немного помощи]).<br />
<br />
А ещё некоторые довольно известные видео-редакторы являются по сути лишь графической надстройкой поверх FFmpeg, вот так-то. Но никто не говорит, что это плохо, например [http://www.winnydows.com/ XviD4PSP] - прекрасный конвертер. Просто зачем использовать тяжёлый GUI, когда всё то же самое можно делать изящно и быстро.<br />
<br />
Ссылки на FFmpeg:<br />
* [http://www.ffmpeg.org/index.html сайт программы];<br />
* [http://ffmpeg.zeranoe.com/builds/ сборки под Windows].<br />
<br />
=== Как это запускать ===<br />
<br />
[[Файл:FFmpeg-готовим-песочницу.png|right|300px|мини|Готовим песочницу]]<br />
<br />
Работает из консоли (командной строки). GUI нет, только хардкор. Подразобравшись с возможностями, можно написать сотни bat'ников или скриптов и творить великие дела со скоростью молнии (той самой, которая на логотипе)<br />
<br />
Да, кстати - он кроссплатформенный, есть версии для Windows, Linux и даже OS X.<br />
<br />
Статья будет про Windows-версию, но всё описанное применимо и к остальным.<br />
<br />
Для начала можно подготовить песочницу следующим образом:<br />
# загрузить архив с программой, распаковать её в куда-нибудь;<br />
# открыть Total Commander (или любой другой... хотя, зачем другой?) двухпанельник и перейти в каталог <code>bin</code>;<br />
# скопировать в этот же каталог видео-файлы, которые требуется обработать. Для удобства можно дать им короткие имена, например <code>1.mp4</code>;<br />
# открыть командную строку из этого каталога;<br />
# всё, можно творить.<br />
<br />
== Набор команд ==<br />
<br />
Далее идёт некоторый список команд с примерами.<br />
<br />
Конечно же, всё это и гораздо большее можно найти в [http://www.ffmpeg.org/documentation.html официальной документации].<br />
<br />
Некоторые операции над видео выполняются без перекодирования (<code>-vcodec copy -acodec copy</code>), некоторые требуют перекодирования (не вникая в детали, можно ставить в таких случаях опцию <code>-crf 18</code>).<br />
<br />
=== Получение информации по файлу ===<br />
<br />
Самая основная команда, будет нужна как предваряющая для многих других.<br />
<br />
Выполняется очень просто:<br />
<syntaxhighlight lang="bash"><br />
ffprobe.exe 1.mp4<br />
</syntaxhighlight><br />
<br />
Результат будет примерно такой:<br />
[[Файл:FFmpeg-file-info.png|center]]<br />
<br />
Среди кучи инфы можно найти, что видео идёт две минуты (<code>Duration: 00:02:00.07</code>) и в контейнере две дорожки:<br />
# <code>Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 1389 kb/s, 29.97 fps</code><br />
# <code>Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 192 kb/s</code><br />
<br />
=== Вырезать фрагмент видео ===<br />
<br />
Хотим сохранить определённый фрагмент видео:<br />
<br />
<syntaxhighlight lang="bash"><br />
ffmpeg -i 1.mp4 -ss 00:03:05 -t 00:01:06 -vcodec copy -acodec copy cut.mp4<br />
</syntaxhighlight><br />
<br />
Эта команда вырежет из файла <code>1.mp4</code> начиная с <code>00:03:05</code> видеофрагмент продолжительностью 66 секунд (<code>00:01:06</code>) и сохранит его в файл под именем <code>cut.mp4</code>.<br />
<br />
=== Вырезать фрагмент видео из исходника с несколькими звуковыми дорожками ===<br />
<br />
Смотрим информацию по файлу:<br />
<syntaxhighlight lang="bash"><br />
ffprobe.exe 1.mp4<br />
</syntaxhighlight><br />
<br />
Помимо прочей информации видим, например, такое:<br />
<syntaxhighlight lang="bash"><br />
Duration: 01:52:52.80, start: 0.000000, bitrate: 2768 kb/s <br />
Stream #0:0: Video: mpeg4 (XVID / 0x44495658), yuv420p, 704x384 [SAR 1:1 DAR 11:6]<br />
Stream #0:1: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, 5.1(side), s16, 448 kb/s<br />
Stream #0:2: Audio: ac3 ([0] [0][0] / 0x2000), 48000 Hz, 5.1(side), s16, 448 kb/s<br />
</syntaxhighlight><br />
<br />
Хотим сохранить 63 секунды видео с определённого момента и вторую дорожку (потому что первая, скажем, мерзкий бубляж):<br />
<syntaxhighlight lang="bash"><br />
ffmpeg -i 1.avi -map 0:0 -map 0:2 -ss 01:37:34 -t 63 -vcodec copy -acodec copy cut.avi<br />
</syntaxhighlight><br />
<br />
Тут есть нюанс. Если дорожка в AC3, то изломается CodecID (был раньше такой косяк контейнера AVI, но возможно его исправили), и звук играться не будет. Однако, можно сложить всё в MKV:<br />
<syntaxhighlight lang="bash"><br />
ffmpeg -fflags genpts -i 1.avi -map 0:0 -map 0:2 -ss 01:37:34 -t 63 -vcodec copy -acodec copy cut.mkv<br />
</syntaxhighlight><br />
<br />
=== Вырезать субтитры из контейнера ===<br />
<br />
Сначала смотрим информацию по файлу (как в примере выше), определяем номер дорожки и:<br />
<br />
<syntaxhighlight lang="bash"><br />
ffmpeg -i 1.mkv -map 0:2 1.ass<br />
</syntaxhighlight><br />
<br />
Это же подходит для извлечения аудиодорожек. Ну и видео тоже. Короче, вообще для любого потока из контейнера. Естественно, расширение выходного файла надо задавать в соответствии с потоком.<br />
<br />
=== Поставить на каждый кадр ватермарку ===<br />
<br />
Например, вы записывали летсплей, но в углу экрана палится ваш ник и надо закрыть его чёрным прямоугольником. Или другая ситуация: хочется закопирайтить что-то и налепить в углу какой-нибудь свой логотип.<br />
<br />
Делается это так:<br />
<syntaxhighlight lang="bash"><br />
ffmpeg.exe -i 1.mp4 -vf "movie=logo.png [logo]; [in][logo] overlay=16:16[out]" -crf 18 2.mkv<br />
</syntaxhighlight><br />
<br />
Тут необходимо перекодирование, потому надо задать параметры кодировки, что и выполняет опция <code>-crf 18</code>. Ватермарка лежит в том же каталоге под именем <code>logo.png</code>. Параметр <code>16:16</code> - координаты позиционирования верхнего левого угла ватермарки.<br />
<br />
=== Кодирование видео ===<br />
<br />
В основном, с целью уменьшить размер файла. Например, видеозапись с цифровика или захваченное видео Fraps.<br />
<br />
Я видел команды на несколько строк, где расписывались битрейты, квантификаторы, фигнификаторы и прочий хардкор, но я же в этом ничего не понимаю, хотелось бы что-то попроще. И оно такое есть, проще некуда:<br />
<br />
<syntaxhighlight lang="bash"><br />
ffmpeg.exe -i 1.avi -crf 18 out.mp4<br />
</syntaxhighlight><br />
<br />
Параметр [https://trac.ffmpeg.org/wiki/Encode/H.264#crf CRF] является некоторым уровнем качества и принимает значения от 0 до 51, где:<br />
* 0 - наилучшее качество;<br />
* 51 - наихудшее качество. Если выбрать больше 51, например 54 или 9000 - будет браться всё равно 51.<br />
<br />
В документации рекомендуется значение 18, выдающее качество "практически равное исходному файлу".<br />
<br />
=== Обрезка (crop) видео ===<br />
<br />
Допустим, у вас исходный файл с разрешением 1366x768, и вы хотите отрезать слева 300 пикселей (или что это за единица размерности). Команда будет такая:<br />
<syntaxhighlight lang="bash"><br />
ffmpeg.exe -i 1.mp4 -filter:v "crop=1066:768:300:0" -crf 18 cut.mp4<br />
</syntaxhighlight><br />
<br />
Первая пара (<code>1066:768</code>) задаёт новый размер кадра, а вторая (<code>300:0</code>) - координаты его левого верхнего угла относительно исходного.<br />
<br />
Для этого необходимо перекодирование, потому надо задать параметры кодировки, что и выполняет опция <code>-crf 18</code>.<br />
<br />
=== Захват экрана ===<br />
<br />
Можно захватывать происходящее на экране и писать в файл, как это делает [http://www.fraps.com/ Fraps]. Но! Тут это можно делать уже сразу с кодированием видео.<br />
<br />
Для этого предварительно потребуется установить устройство захвата (в примере используется [http://sourceforge.net/projects/screencapturer/files/ Screen Capture Recorder]).<br />
<syntaxhighlight lang="bash"><br />
ffmpeg.exe -f dshow -i audio="virtual-audio-capturer":video="screen-capture-recorder" -acodec pcm_s16le <br />
-vcodec libx264 -preset ultrafast -qp 0 testing.mkv<br />
</syntaxhighlight><br />
<br />
== Ещё команды ==<br />
<br />
В большом количестве такие же сбоники рецептов есть в интернетах, например:<br />
* [http://habrahabr.ru/post/171213/ 19 команд FFmpeg для любых нужд];<br />
* [http://rus-linux.net/nlib.php?name=/MyLDP/mm/7-tricks-with-ffmpeg-ru.html Семь трюков с FFmpeg];<br />
* [http://shurshun.ru/ffmpeg-bazovyie-komandyi/ FFmpeg - базовые команды];<br />
* [http://nosovdn-cisco.blogspot.ru/2014/09/ffmpeg.html Кодировка с FFmpeg].<br />
<br />
[[Категория:Мультимедиа]]</div>
217.14.52.2
https://iu5bmstu.ru/index.php?title=Note&diff=4650
Note
2014-01-22T08:28:22Z
<p>217.14.52.2: </p>
<hr />
<div>Беспалевная правка</div>
217.14.52.2
https://iu5bmstu.ru/index.php?title=Note&diff=4649
Note
2014-01-22T08:23:31Z
<p>217.14.52.2: </p>
<hr />
<div>Беспалевная правка<br />
<br />
http://www.rsdn.ru/forum/other/1014270.all</div>
217.14.52.2
https://iu5bmstu.ru/index.php?title=Note&diff=4597
Note
2013-12-24T11:05:38Z
<p>217.14.52.2: Новая страница: «http://djekmusic.blogspot.com/2012/07/xml-microsoft-sql-server-2008-xml_17.html»</p>
<hr />
<div>http://djekmusic.blogspot.com/2012/07/xml-microsoft-sql-server-2008-xml_17.html</div>
217.14.52.2
https://iu5bmstu.ru/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%98%D0%9D%D0%9D,_%D0%9A%D0%9F%D0%9F_%D0%B8_%D0%9E%D0%93%D0%A0%D0%9D&diff=4533
Проверка ИНН, КПП и ОГРН
2013-12-06T09:08:49Z
<p>217.14.52.2: /* ОГРН */ JS не пустит int</p>
<hr />
<div>Что такое ИНН, КПП, ОГРН и как программно проверять их значения на корректность. Бонусом к статье идёт готовое приложение под Windows.<br />
__TOC__<br />
== Теория ==<br />
<br />
Сначала, что это такое:<br />
* [http://ru.wikipedia.org/wiki/%D0%98%D0%B4%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80_%D0%BD%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%BF%D0%BB%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%89%D0%B8%D0%BA%D0%B0 Идентификационный номер налогоплательщика (ИНН)];<br />
* [http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%B4_%D0%BF%D1%80%D0%B8%D1%87%D0%B8%D0%BD%D1%8B_%D0%BF%D0%BE%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B8_%D0%BD%D0%B0_%D1%83%D1%87%D1%91%D1%82 Код причины постановки на учёт (КПП)];<br />
* [http://ru.wikipedia.org/wiki/%D0%9E%D0%93%D0%A0%D0%9D Основной государственный регистрационный номер (ОГРН)].<br />
<br />
Вкратце, суть: эти значения (за исключением КПП) содержат контрольную цифру, по которой можно проверить их корректность. Контрольная цифра вычисляется по формуле, которую затруднительно посчитать в уме не отходя от кассы, потому надо поручить это компьютеру. С КПП всё проще - там просто соответствие регулярному выражению, но мы и это спихнём компу.<br />
<br />
Ниже приведены программные решения этой задачи. [http://lurkmore.to/%D0%B8%D0%BD%D0%B4%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BE%D0%B4 Индусский код] инклюдед.<br />
<br />
== Практика ==<br />
<br />
=== C# ===<br />
<br />
==== ИНН ====<br />
<br />
<syntaxhighlight line lang="csharp"><br />
/// <summary><br />
/// проверка ИНН по контрольной цифре<br />
/// </summary><br />
/// <param name="INN">ИНН для проверки</param><br />
/// <returns>true - если проходит проверку, false - если не проходит проверку</returns><br />
public bool check_INN(string INNstring)<br />
{<br />
// является ли вообще числом<br />
try { Int64.Parse(INNstring); } catch { return false; }<br />
<br />
// проверка на 10 и 12 цифр<br />
if (INNstring.Length != 10 && INNstring.Length != 12) { return false; }<br />
<br />
// проверка по контрольным цифрам<br />
if (INNstring.Length == 10) // для юридического лица<br />
{<br />
int dgt10 = 0;<br />
try<br />
{<br />
dgt10 = (((2 * Int32.Parse(INNstring.Substring(0,1))<br />
+ 4 * Int32.Parse(INNstring.Substring(1,1))<br />
+ 10 * Int32.Parse(INNstring.Substring(2,1))<br />
+ 3 * Int32.Parse(INNstring.Substring(3,1))<br />
+ 5 * Int32.Parse(INNstring.Substring(4,1))<br />
+ 9 * Int32.Parse(INNstring.Substring(5,1))<br />
+ 4 * Int32.Parse(INNstring.Substring(6,1))<br />
+ 6 * Int32.Parse(INNstring.Substring(7,1))<br />
+ 8 * Int32.Parse(INNstring.Substring(8,1))) % 11) % 10);<br />
}<br />
catch { return false; }<br />
<br />
if (Int32.Parse(INNstring.Substring(9,1)) == dgt10) { return true; }<br />
else { return false; }<br />
}<br />
else // для физического лица<br />
{<br />
int dgt11 = 0, dgt12 = 0;<br />
try<br />
{<br />
dgt11 = (((<br />
7 * Int32.Parse(INNstring.Substring(0,1))<br />
+ 2 * Int32.Parse(INNstring.Substring(1,1))<br />
+ 4 * Int32.Parse(INNstring.Substring(2,1))<br />
+ 10 * Int32.Parse(INNstring.Substring(3,1))<br />
+ 3 * Int32.Parse(INNstring.Substring(4,1))<br />
+ 5 * Int32.Parse(INNstring.Substring(5,1))<br />
+ 9 * Int32.Parse(INNstring.Substring(6,1))<br />
+ 4 * Int32.Parse(INNstring.Substring(7,1))<br />
+ 6 * Int32.Parse(INNstring.Substring(8,1))<br />
+ 8 * Int32.Parse(INNstring.Substring(9,1))) % 11) % 10);<br />
dgt12 = (((<br />
3 * Int32.Parse(INNstring.Substring(0,1))<br />
+ 7 * Int32.Parse(INNstring.Substring(1,1))<br />
+ 2 * Int32.Parse(INNstring.Substring(2,1))<br />
+ 4 * Int32.Parse(INNstring.Substring(3,1))<br />
+ 10 * Int32.Parse(INNstring.Substring(4,1))<br />
+ 3 * Int32.Parse(INNstring.Substring(5,1))<br />
+ 5 * Int32.Parse(INNstring.Substring(6,1))<br />
+ 9 * Int32.Parse(INNstring.Substring(7,1))<br />
+ 4 * Int32.Parse(INNstring.Substring(8,1))<br />
+ 6 * Int32.Parse(INNstring.Substring(9,1))<br />
+ 8 * Int32.Parse(INNstring.Substring(10,1))) % 11) % 10);<br />
}<br />
catch { return false; }<br />
if (Int32.Parse(INNstring.Substring(10,1)) == dgt11<br />
&& Int32.Parse(INNstring.Substring(11,1)) == dgt12) { return true; }<br />
else { return false; }<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
==== КПП ====<br />
<br />
<syntaxhighlight line lang="csharp"><br />
/// <summary><br />
/// проверка КПП по регулярному выражению<br />
/// </summary><br />
/// <param name="KPPstring">КПП для проверки</param><br />
/// <returns>true - если проходит проверку, false - если не проходит проверку</returns><br />
public bool check_KPP(string KPPstring)<br />
{<br />
return new Regex(@"\d{4}[\dA-Z][\dA-Z]\d{3}").IsMatch(KPPstring);<br />
}<br />
</syntaxhighlight><br />
<br />
==== ОГРН ====<br />
<br />
<syntaxhighlight line lang="csharp"><br />
/// <summary><br />
/// проверка ОГРН по контрольной цифре<br />
/// </summary><br />
/// <param name="OGRNstring">ОГРН для проверки</param><br />
/// <returns>true - если проходит проверку, false - если не проходит проверку</returns><br />
public bool check_OGRN(string OGRNstring)<br />
{<br />
// является ли вообще числом<br />
long number = 0;<br />
try { number = Int64.Parse(OGRNstring); }<br />
catch { return false; }<br />
<br />
// проверка на 13 и 15 цифр<br />
if (OGRNstring.Length != 13 && OGRNstring.Length != 15) { return false; }<br />
<br />
// проверка по контрольным цифрам<br />
if (OGRNstring.Length == 13) // для юридического лица<br />
{<br />
// остаток от деления<br />
int num12 = (int)Math.Floor(((double)number / 10) % 11);<br />
int dgt13 = -1;<br />
// если остаток равен 10, то берём 0, если нет, то берём его самого<br />
if (num12 == 10) { dgt13 = 0; } else { dgt13 = num12; }<br />
// ну и теперь сравниваем с контрольной цифрой<br />
if (Int32.Parse(OGRNstring.Substring(12, 1)) == dgt13) { return true; }<br />
else { return false; }<br />
}<br />
else // для индивидуального предпринимателя<br />
{<br />
// остаток от деления<br />
int num14 = (int)Math.Floor(((double)number / 10) % 13);<br />
int dgt15 = num14 % 10;<br />
// ну и теперь сравниваем с контрольной цифрой<br />
if (Int32.Parse(OGRNstring.Substring(14, 1)) == dgt15) { return true; }<br />
else { return false; }<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
==== Готовое приложение ====<br />
<br />
В процессе написания случайно получилось готовое приложение (под Windows, конечно):<br />
* [http://yadi.sk/d/2f9whbf6Dbv7v само приложение] (Требует .NET 4.5.1.);<br />
* [http://yadi.sk/d/Q30Vcj2eDbvAq исходники проекта] (MS Visual Studio 2013).<br />
<br />
[[Файл:Validations screen.png|center]]<br />
<br />
=== JavaScript ===<br />
<br />
Допустим, есть какая-то веб-страница с формой, где присутствуют поля ИНН, КПП и ОГРН. Чтобы не дёргать сервер по мелочам, можно выполнить валидацию этих полей с помощью JavaScript, повесив на какой-нибудь <code>onclick</code>, например, следующие функции.<br />
<br />
==== ИНН ====<br />
<br />
<syntaxhighlight line lang="javascript"><br />
function isINNvalid(sender, args) {<br />
// проверка на число<br />
if (args.Value.match(/\D/)) {<br />
//alert("Введённый ИНН не является числом");<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
// проверка на 10 и 12 цифр<br />
if (args.Value.length != 12 && args.Value.length != 10) {<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
// проверка по контрольным цифрам<br />
if (args.Value.length == 10) {<br />
var dgt10 = String(((<br />
2 * args.Value[0] + 4 * args.Value[1] + 10 * args.Value[2] +<br />
3 * args.Value[3] + 5 * args.Value[4] + 9 * args.Value[5] +<br />
4 * args.Value[6] + 6 * args.Value[7] + 8 * args.Value[8]) % 11) % 10);<br />
if (args.Value[9] == dgt10) {<br />
args.IsValid = true;<br />
return args.IsValid;<br />
}<br />
else {<br />
//alert("Введённый ИНН не прошёл проверку по контрольным цифрам");<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
}<br />
if (args.Value.length == 12) {<br />
var dgt11 = String(((<br />
7 * args.Value[0] + 2 * args.Value[1] + 4 * args.Value[2] +<br />
10 * args.Value[3] + 3 * args.Value[4] + 5 * args.Value[5] +<br />
9 * args.Value[6] + 4 * args.Value[7] + 6 * args.Value[8] +<br />
8 * args.Value[9]) % 11) % 10);<br />
var dgt12 = String(((<br />
3 * args.Value[0] + 7 * args.Value[1] + 2 * args.Value[2] +<br />
4 * args.Value[3] + 10 * args.Value[4] + 3 * args.Value[5] +<br />
5 * args.Value[6] + 9 * args.Value[7] + 4 * args.Value[8] +<br />
6 * args.Value[9] + 8 * args.Value[10]) % 11) % 10);<br />
if (args.Value[10] == dgt11 && args.Value[11] == dgt12)<br />
{<br />
args.IsValid = true;<br />
return args.IsValid;<br />
}<br />
else {<br />
//alert("Введённый ИНН не прошёл проверку по контрольным цифрам");<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
==== КПП ====<br />
<br />
<syntaxhighlight line lang="javascript"><br />
function isKPPvalid(sender, args) {<br />
if (args.Value.length != 9) {<br />
//alert("КПП должен представлять собой девятизначный код");<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
if (!args.Value.match(/\d{4}[\dA-Z][\dA-Z]\d{3}/)) {<br />
//alert("КПП не соответствует формату");<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
else {<br />
args.IsValid = true;<br />
return args.IsValid;<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
==== ОГРН ====<br />
<br />
<syntaxhighlight line lang="javascript"><br />
function isOGRNvalid(sender, args) {<br />
// проверка на число<br />
if (args.Value.match(/\D/)) {<br />
//alert("Введённый ОГРН не является числом");<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
// проверка на 13 и 15 цифр<br />
if (args.Value.length != 13 && args.Value.length != 15) {<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
// проверка ОГРН для ЮЛ<br />
if (args.Value.length == 13) {<br />
// проверка по контрольным цифрам<br />
var num12 = args.Value;<br />
num12 = Math.floor((num12 / 10) % 11);<br />
if (num12 == 10) { dgt13 = 0; }<br />
else { dgt13 = num12; }<br />
if (args.Value[12] == dgt13) {<br />
args.IsValid = true;<br />
return args.IsValid;<br />
}<br />
else {<br />
//alert("Введённый ОГРН не прошёл проверку по контрольным цифрам");<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
}<br />
// проверка ОГРН для ИП<br />
if (args.Value.length == 15) {<br />
// проверка по контрольным цифрам<br />
var num14 = args.Value;<br />
num14 = Math.floor((num14 / 10) % 13);<br />
var dgt15 = num14 % 10;<br />
if (args.Value[14] == dgt15) {<br />
args.IsValid = true;<br />
return args.IsValid;<br />
}<br />
else {<br />
//alert("Введённый ОГРН не прошёл проверку по контрольным цифрам");<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
[[Категория:Продлёнка]]<br />
[[Категория:C Sharp]]<br />
[[Категория:JavaScript]]</div>
217.14.52.2
https://iu5bmstu.ru/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%98%D0%9D%D0%9D,_%D0%9A%D0%9F%D0%9F_%D0%B8_%D0%9E%D0%93%D0%A0%D0%9D&diff=4532
Проверка ИНН, КПП и ОГРН
2013-12-06T07:46:10Z
<p>217.14.52.2: /* ОГРН */ косяк в проверке ОГРН ИП</p>
<hr />
<div>Что такое ИНН, КПП, ОГРН и как программно проверять их значения на корректность. Бонусом к статье идёт готовое приложение под Windows.<br />
__TOC__<br />
== Теория ==<br />
<br />
Сначала, что это такое:<br />
* [http://ru.wikipedia.org/wiki/%D0%98%D0%B4%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80_%D0%BD%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%BF%D0%BB%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%89%D0%B8%D0%BA%D0%B0 Идентификационный номер налогоплательщика (ИНН)];<br />
* [http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%B4_%D0%BF%D1%80%D0%B8%D1%87%D0%B8%D0%BD%D1%8B_%D0%BF%D0%BE%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B8_%D0%BD%D0%B0_%D1%83%D1%87%D1%91%D1%82 Код причины постановки на учёт (КПП)];<br />
* [http://ru.wikipedia.org/wiki/%D0%9E%D0%93%D0%A0%D0%9D Основной государственный регистрационный номер (ОГРН)].<br />
<br />
Вкратце, суть: эти значения (за исключением КПП) содержат контрольную цифру, по которой можно проверить их корректность. Контрольная цифра вычисляется по формуле, которую затруднительно посчитать в уме не отходя от кассы, потому надо поручить это компьютеру. С КПП всё проще - там просто соответствие регулярному выражению, но мы и это спихнём компу.<br />
<br />
Ниже приведены программные решения этой задачи. [http://lurkmore.to/%D0%B8%D0%BD%D0%B4%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BE%D0%B4 Индусский код] инклюдед.<br />
<br />
== Практика ==<br />
<br />
=== C# ===<br />
<br />
==== ИНН ====<br />
<br />
<syntaxhighlight line lang="csharp"><br />
/// <summary><br />
/// проверка ИНН по контрольной цифре<br />
/// </summary><br />
/// <param name="INN">ИНН для проверки</param><br />
/// <returns>true - если проходит проверку, false - если не проходит проверку</returns><br />
public bool check_INN(string INNstring)<br />
{<br />
// является ли вообще числом<br />
try { Int64.Parse(INNstring); } catch { return false; }<br />
<br />
// проверка на 10 и 12 цифр<br />
if (INNstring.Length != 10 && INNstring.Length != 12) { return false; }<br />
<br />
// проверка по контрольным цифрам<br />
if (INNstring.Length == 10) // для юридического лица<br />
{<br />
int dgt10 = 0;<br />
try<br />
{<br />
dgt10 = (((2 * Int32.Parse(INNstring.Substring(0,1))<br />
+ 4 * Int32.Parse(INNstring.Substring(1,1))<br />
+ 10 * Int32.Parse(INNstring.Substring(2,1))<br />
+ 3 * Int32.Parse(INNstring.Substring(3,1))<br />
+ 5 * Int32.Parse(INNstring.Substring(4,1))<br />
+ 9 * Int32.Parse(INNstring.Substring(5,1))<br />
+ 4 * Int32.Parse(INNstring.Substring(6,1))<br />
+ 6 * Int32.Parse(INNstring.Substring(7,1))<br />
+ 8 * Int32.Parse(INNstring.Substring(8,1))) % 11) % 10);<br />
}<br />
catch { return false; }<br />
<br />
if (Int32.Parse(INNstring.Substring(9,1)) == dgt10) { return true; }<br />
else { return false; }<br />
}<br />
else // для физического лица<br />
{<br />
int dgt11 = 0, dgt12 = 0;<br />
try<br />
{<br />
dgt11 = (((<br />
7 * Int32.Parse(INNstring.Substring(0,1))<br />
+ 2 * Int32.Parse(INNstring.Substring(1,1))<br />
+ 4 * Int32.Parse(INNstring.Substring(2,1))<br />
+ 10 * Int32.Parse(INNstring.Substring(3,1))<br />
+ 3 * Int32.Parse(INNstring.Substring(4,1))<br />
+ 5 * Int32.Parse(INNstring.Substring(5,1))<br />
+ 9 * Int32.Parse(INNstring.Substring(6,1))<br />
+ 4 * Int32.Parse(INNstring.Substring(7,1))<br />
+ 6 * Int32.Parse(INNstring.Substring(8,1))<br />
+ 8 * Int32.Parse(INNstring.Substring(9,1))) % 11) % 10);<br />
dgt12 = (((<br />
3 * Int32.Parse(INNstring.Substring(0,1))<br />
+ 7 * Int32.Parse(INNstring.Substring(1,1))<br />
+ 2 * Int32.Parse(INNstring.Substring(2,1))<br />
+ 4 * Int32.Parse(INNstring.Substring(3,1))<br />
+ 10 * Int32.Parse(INNstring.Substring(4,1))<br />
+ 3 * Int32.Parse(INNstring.Substring(5,1))<br />
+ 5 * Int32.Parse(INNstring.Substring(6,1))<br />
+ 9 * Int32.Parse(INNstring.Substring(7,1))<br />
+ 4 * Int32.Parse(INNstring.Substring(8,1))<br />
+ 6 * Int32.Parse(INNstring.Substring(9,1))<br />
+ 8 * Int32.Parse(INNstring.Substring(10,1))) % 11) % 10);<br />
}<br />
catch { return false; }<br />
if (Int32.Parse(INNstring.Substring(10,1)) == dgt11<br />
&& Int32.Parse(INNstring.Substring(11,1)) == dgt12) { return true; }<br />
else { return false; }<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
==== КПП ====<br />
<br />
<syntaxhighlight line lang="csharp"><br />
/// <summary><br />
/// проверка КПП по регулярному выражению<br />
/// </summary><br />
/// <param name="KPPstring">КПП для проверки</param><br />
/// <returns>true - если проходит проверку, false - если не проходит проверку</returns><br />
public bool check_KPP(string KPPstring)<br />
{<br />
return new Regex(@"\d{4}[\dA-Z][\dA-Z]\d{3}").IsMatch(KPPstring);<br />
}<br />
</syntaxhighlight><br />
<br />
==== ОГРН ====<br />
<br />
<syntaxhighlight line lang="csharp"><br />
/// <summary><br />
/// проверка ОГРН по контрольной цифре<br />
/// </summary><br />
/// <param name="OGRNstring">ОГРН для проверки</param><br />
/// <returns>true - если проходит проверку, false - если не проходит проверку</returns><br />
public bool check_OGRN(string OGRNstring)<br />
{<br />
// является ли вообще числом<br />
long number = 0;<br />
try { number = Int64.Parse(OGRNstring); }<br />
catch { return false; }<br />
<br />
// проверка на 13 и 15 цифр<br />
if (OGRNstring.Length != 13 && OGRNstring.Length != 15) { return false; }<br />
<br />
// проверка по контрольным цифрам<br />
if (OGRNstring.Length == 13) // для юридического лица<br />
{<br />
// остаток от деления<br />
int num12 = (int)Math.Floor(((double)number / 10) % 11);<br />
int dgt13 = -1;<br />
// если остаток равен 10, то берём 0, если нет, то берём его самого<br />
if (num12 == 10) { dgt13 = 0; } else { dgt13 = num12; }<br />
// ну и теперь сравниваем с контрольной цифрой<br />
if (Int32.Parse(OGRNstring.Substring(12, 1)) == dgt13) { return true; }<br />
else { return false; }<br />
}<br />
else // для индивидуального предпринимателя<br />
{<br />
// остаток от деления<br />
int num14 = (int)Math.Floor(((double)number / 10) % 13);<br />
int dgt15 = num14 % 10;<br />
// ну и теперь сравниваем с контрольной цифрой<br />
if (Int32.Parse(OGRNstring.Substring(14, 1)) == dgt15) { return true; }<br />
else { return false; }<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
==== Готовое приложение ====<br />
<br />
В процессе написания случайно получилось готовое приложение (под Windows, конечно):<br />
* [http://yadi.sk/d/2f9whbf6Dbv7v само приложение] (Требует .NET 4.5.1.);<br />
* [http://yadi.sk/d/Q30Vcj2eDbvAq исходники проекта] (MS Visual Studio 2013).<br />
<br />
[[Файл:Validations screen.png|center]]<br />
<br />
=== JavaScript ===<br />
<br />
Допустим, есть какая-то веб-страница с формой, где присутствуют поля ИНН, КПП и ОГРН. Чтобы не дёргать сервер по мелочам, можно выполнить валидацию этих полей с помощью JavaScript, повесив на какой-нибудь <code>onclick</code>, например, следующие функции.<br />
<br />
==== ИНН ====<br />
<br />
<syntaxhighlight line lang="javascript"><br />
function isINNvalid(sender, args) {<br />
// проверка на число<br />
if (args.Value.match(/\D/)) {<br />
//alert("Введённый ИНН не является числом");<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
// проверка на 10 и 12 цифр<br />
if (args.Value.length != 12 && args.Value.length != 10) {<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
// проверка по контрольным цифрам<br />
if (args.Value.length == 10) {<br />
var dgt10 = String(((<br />
2 * args.Value[0] + 4 * args.Value[1] + 10 * args.Value[2] +<br />
3 * args.Value[3] + 5 * args.Value[4] + 9 * args.Value[5] +<br />
4 * args.Value[6] + 6 * args.Value[7] + 8 * args.Value[8]) % 11) % 10);<br />
if (args.Value[9] == dgt10) {<br />
args.IsValid = true;<br />
return args.IsValid;<br />
}<br />
else {<br />
//alert("Введённый ИНН не прошёл проверку по контрольным цифрам");<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
}<br />
if (args.Value.length == 12) {<br />
var dgt11 = String(((<br />
7 * args.Value[0] + 2 * args.Value[1] + 4 * args.Value[2] +<br />
10 * args.Value[3] + 3 * args.Value[4] + 5 * args.Value[5] +<br />
9 * args.Value[6] + 4 * args.Value[7] + 6 * args.Value[8] +<br />
8 * args.Value[9]) % 11) % 10);<br />
var dgt12 = String(((<br />
3 * args.Value[0] + 7 * args.Value[1] + 2 * args.Value[2] +<br />
4 * args.Value[3] + 10 * args.Value[4] + 3 * args.Value[5] +<br />
5 * args.Value[6] + 9 * args.Value[7] + 4 * args.Value[8] +<br />
6 * args.Value[9] + 8 * args.Value[10]) % 11) % 10);<br />
if (args.Value[10] == dgt11 && args.Value[11] == dgt12)<br />
{<br />
args.IsValid = true;<br />
return args.IsValid;<br />
}<br />
else {<br />
//alert("Введённый ИНН не прошёл проверку по контрольным цифрам");<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
==== КПП ====<br />
<br />
<syntaxhighlight line lang="javascript"><br />
function isKPPvalid(sender, args) {<br />
if (args.Value.length != 9) {<br />
//alert("КПП должен представлять собой девятизначный код");<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
if (!args.Value.match(/\d{4}[\dA-Z][\dA-Z]\d{3}/)) {<br />
//alert("КПП не соответствует формату");<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
else {<br />
args.IsValid = true;<br />
return args.IsValid;<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
==== ОГРН ====<br />
<br />
<syntaxhighlight line lang="javascript"><br />
function isOGRNvalid(sender, args) {<br />
// проверка на число<br />
if (args.Value.match(/\D/)) {<br />
//alert("Введённый ОГРН не является числом");<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
// проверка на 13 и 15 цифр<br />
if (args.Value.length != 13 && args.Value.length != 15) {<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
// проверка ОГРН для ЮЛ<br />
if (args.Value.length == 13) {<br />
// проверка по контрольным цифрам<br />
var num12 = args.Value;<br />
num12 = Math.floor((num12 / 10) % 11);<br />
if (num12 == 10) { dgt13 = 0; }<br />
else { dgt13 = num12; }<br />
if (args.Value[12] == dgt13) {<br />
args.IsValid = true;<br />
return args.IsValid;<br />
}<br />
else {<br />
//alert("Введённый ОГРН не прошёл проверку по контрольным цифрам");<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
}<br />
// проверка ОГРН для ИП<br />
if (args.Value.length == 15) {<br />
// проверка по контрольным цифрам<br />
var num14 = args.Value;<br />
num14 = Math.floor((num14 / 10) % 13);<br />
int dgt15 = num14 % 10;<br />
if (args.Value[14] == dgt15) {<br />
args.IsValid = true;<br />
return args.IsValid;<br />
}<br />
else {<br />
//alert("Введённый ОГРН не прошёл проверку по контрольным цифрам");<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
[[Категория:Продлёнка]]<br />
[[Категория:C Sharp]]<br />
[[Категория:JavaScript]]</div>
217.14.52.2
https://iu5bmstu.ru/index.php?title=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D0%98%D0%9D%D0%9D,_%D0%9A%D0%9F%D0%9F_%D0%B8_%D0%9E%D0%93%D0%A0%D0%9D&diff=4531
Проверка ИНН, КПП и ОГРН
2013-12-06T07:44:48Z
<p>217.14.52.2: /* ОГРН */ косяк в проверке ОГРН ИП</p>
<hr />
<div>Что такое ИНН, КПП, ОГРН и как программно проверять их значения на корректность. Бонусом к статье идёт готовое приложение под Windows.<br />
__TOC__<br />
== Теория ==<br />
<br />
Сначала, что это такое:<br />
* [http://ru.wikipedia.org/wiki/%D0%98%D0%B4%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80_%D0%BD%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%BF%D0%BB%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%89%D0%B8%D0%BA%D0%B0 Идентификационный номер налогоплательщика (ИНН)];<br />
* [http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%B4_%D0%BF%D1%80%D0%B8%D1%87%D0%B8%D0%BD%D1%8B_%D0%BF%D0%BE%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B8_%D0%BD%D0%B0_%D1%83%D1%87%D1%91%D1%82 Код причины постановки на учёт (КПП)];<br />
* [http://ru.wikipedia.org/wiki/%D0%9E%D0%93%D0%A0%D0%9D Основной государственный регистрационный номер (ОГРН)].<br />
<br />
Вкратце, суть: эти значения (за исключением КПП) содержат контрольную цифру, по которой можно проверить их корректность. Контрольная цифра вычисляется по формуле, которую затруднительно посчитать в уме не отходя от кассы, потому надо поручить это компьютеру. С КПП всё проще - там просто соответствие регулярному выражению, но мы и это спихнём компу.<br />
<br />
Ниже приведены программные решения этой задачи. [http://lurkmore.to/%D0%B8%D0%BD%D0%B4%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BE%D0%B4 Индусский код] инклюдед.<br />
<br />
== Практика ==<br />
<br />
=== C# ===<br />
<br />
==== ИНН ====<br />
<br />
<syntaxhighlight line lang="csharp"><br />
/// <summary><br />
/// проверка ИНН по контрольной цифре<br />
/// </summary><br />
/// <param name="INN">ИНН для проверки</param><br />
/// <returns>true - если проходит проверку, false - если не проходит проверку</returns><br />
public bool check_INN(string INNstring)<br />
{<br />
// является ли вообще числом<br />
try { Int64.Parse(INNstring); } catch { return false; }<br />
<br />
// проверка на 10 и 12 цифр<br />
if (INNstring.Length != 10 && INNstring.Length != 12) { return false; }<br />
<br />
// проверка по контрольным цифрам<br />
if (INNstring.Length == 10) // для юридического лица<br />
{<br />
int dgt10 = 0;<br />
try<br />
{<br />
dgt10 = (((2 * Int32.Parse(INNstring.Substring(0,1))<br />
+ 4 * Int32.Parse(INNstring.Substring(1,1))<br />
+ 10 * Int32.Parse(INNstring.Substring(2,1))<br />
+ 3 * Int32.Parse(INNstring.Substring(3,1))<br />
+ 5 * Int32.Parse(INNstring.Substring(4,1))<br />
+ 9 * Int32.Parse(INNstring.Substring(5,1))<br />
+ 4 * Int32.Parse(INNstring.Substring(6,1))<br />
+ 6 * Int32.Parse(INNstring.Substring(7,1))<br />
+ 8 * Int32.Parse(INNstring.Substring(8,1))) % 11) % 10);<br />
}<br />
catch { return false; }<br />
<br />
if (Int32.Parse(INNstring.Substring(9,1)) == dgt10) { return true; }<br />
else { return false; }<br />
}<br />
else // для физического лица<br />
{<br />
int dgt11 = 0, dgt12 = 0;<br />
try<br />
{<br />
dgt11 = (((<br />
7 * Int32.Parse(INNstring.Substring(0,1))<br />
+ 2 * Int32.Parse(INNstring.Substring(1,1))<br />
+ 4 * Int32.Parse(INNstring.Substring(2,1))<br />
+ 10 * Int32.Parse(INNstring.Substring(3,1))<br />
+ 3 * Int32.Parse(INNstring.Substring(4,1))<br />
+ 5 * Int32.Parse(INNstring.Substring(5,1))<br />
+ 9 * Int32.Parse(INNstring.Substring(6,1))<br />
+ 4 * Int32.Parse(INNstring.Substring(7,1))<br />
+ 6 * Int32.Parse(INNstring.Substring(8,1))<br />
+ 8 * Int32.Parse(INNstring.Substring(9,1))) % 11) % 10);<br />
dgt12 = (((<br />
3 * Int32.Parse(INNstring.Substring(0,1))<br />
+ 7 * Int32.Parse(INNstring.Substring(1,1))<br />
+ 2 * Int32.Parse(INNstring.Substring(2,1))<br />
+ 4 * Int32.Parse(INNstring.Substring(3,1))<br />
+ 10 * Int32.Parse(INNstring.Substring(4,1))<br />
+ 3 * Int32.Parse(INNstring.Substring(5,1))<br />
+ 5 * Int32.Parse(INNstring.Substring(6,1))<br />
+ 9 * Int32.Parse(INNstring.Substring(7,1))<br />
+ 4 * Int32.Parse(INNstring.Substring(8,1))<br />
+ 6 * Int32.Parse(INNstring.Substring(9,1))<br />
+ 8 * Int32.Parse(INNstring.Substring(10,1))) % 11) % 10);<br />
}<br />
catch { return false; }<br />
if (Int32.Parse(INNstring.Substring(10,1)) == dgt11<br />
&& Int32.Parse(INNstring.Substring(11,1)) == dgt12) { return true; }<br />
else { return false; }<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
==== КПП ====<br />
<br />
<syntaxhighlight line lang="csharp"><br />
/// <summary><br />
/// проверка КПП по регулярному выражению<br />
/// </summary><br />
/// <param name="KPPstring">КПП для проверки</param><br />
/// <returns>true - если проходит проверку, false - если не проходит проверку</returns><br />
public bool check_KPP(string KPPstring)<br />
{<br />
return new Regex(@"\d{4}[\dA-Z][\dA-Z]\d{3}").IsMatch(KPPstring);<br />
}<br />
</syntaxhighlight><br />
<br />
==== ОГРН ====<br />
<br />
<syntaxhighlight line lang="csharp"><br />
/// <summary><br />
/// проверка ОГРН по контрольной цифре<br />
/// </summary><br />
/// <param name="OGRNstring">ОГРН для проверки</param><br />
/// <returns>true - если проходит проверку, false - если не проходит проверку</returns><br />
public bool check_OGRN(string OGRNstring)<br />
{<br />
// является ли вообще числом<br />
long number = 0;<br />
try { number = Int64.Parse(OGRNstring); }<br />
catch { return false; }<br />
<br />
// проверка на 13 и 15 цифр<br />
if (OGRNstring.Length != 13 && OGRNstring.Length != 15) { return false; }<br />
<br />
// проверка по контрольным цифрам<br />
if (OGRNstring.Length == 13) // для юридического лица<br />
{<br />
// остаток от деления<br />
int num12 = (int)Math.Floor(((double)number / 10) % 11);<br />
int dgt13 = -1;<br />
// если остаток равен 10, то берём 0, если нет, то берём его самого<br />
if (num12 == 10) { dgt13 = 0; } else { dgt13 = num12; }<br />
// ну и теперь сравниваем с контрольной цифрой<br />
if (Int32.Parse(OGRNstring.Substring(12, 1)) == dgt13) { return true; }<br />
else { return false; }<br />
}<br />
else // для индивидуального предпринимателя<br />
{<br />
// остаток от деления<br />
int num14 = (int)Math.Floor(((double)number / 10) % 13);<br />
int dgt15 = num14 % 10;<br />
// ну и теперь сравниваем с контрольной цифрой<br />
if (Int32.Parse(OGRNstring.Substring(14, 1)) == dgt15) { return true; }<br />
else { return false; }<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
==== Готовое приложение ====<br />
<br />
В процессе написания случайно получилось готовое приложение (под Windows, конечно):<br />
* [http://yadi.sk/d/2f9whbf6Dbv7v само приложение] (Требует .NET 4.5.1.);<br />
* [http://yadi.sk/d/Q30Vcj2eDbvAq исходники проекта] (MS Visual Studio 2013).<br />
<br />
[[Файл:Validations screen.png|center]]<br />
<br />
=== JavaScript ===<br />
<br />
Допустим, есть какая-то веб-страница с формой, где присутствуют поля ИНН, КПП и ОГРН. Чтобы не дёргать сервер по мелочам, можно выполнить валидацию этих полей с помощью JavaScript, повесив на какой-нибудь <code>onclick</code>, например, следующие функции.<br />
<br />
==== ИНН ====<br />
<br />
<syntaxhighlight line lang="javascript"><br />
function isINNvalid(sender, args) {<br />
// проверка на число<br />
if (args.Value.match(/\D/)) {<br />
//alert("Введённый ИНН не является числом");<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
// проверка на 10 и 12 цифр<br />
if (args.Value.length != 12 && args.Value.length != 10) {<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
// проверка по контрольным цифрам<br />
if (args.Value.length == 10) {<br />
var dgt10 = String(((<br />
2 * args.Value[0] + 4 * args.Value[1] + 10 * args.Value[2] +<br />
3 * args.Value[3] + 5 * args.Value[4] + 9 * args.Value[5] +<br />
4 * args.Value[6] + 6 * args.Value[7] + 8 * args.Value[8]) % 11) % 10);<br />
if (args.Value[9] == dgt10) {<br />
args.IsValid = true;<br />
return args.IsValid;<br />
}<br />
else {<br />
//alert("Введённый ИНН не прошёл проверку по контрольным цифрам");<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
}<br />
if (args.Value.length == 12) {<br />
var dgt11 = String(((<br />
7 * args.Value[0] + 2 * args.Value[1] + 4 * args.Value[2] +<br />
10 * args.Value[3] + 3 * args.Value[4] + 5 * args.Value[5] +<br />
9 * args.Value[6] + 4 * args.Value[7] + 6 * args.Value[8] +<br />
8 * args.Value[9]) % 11) % 10);<br />
var dgt12 = String(((<br />
3 * args.Value[0] + 7 * args.Value[1] + 2 * args.Value[2] +<br />
4 * args.Value[3] + 10 * args.Value[4] + 3 * args.Value[5] +<br />
5 * args.Value[6] + 9 * args.Value[7] + 4 * args.Value[8] +<br />
6 * args.Value[9] + 8 * args.Value[10]) % 11) % 10);<br />
if (args.Value[10] == dgt11 && args.Value[11] == dgt12)<br />
{<br />
args.IsValid = true;<br />
return args.IsValid;<br />
}<br />
else {<br />
//alert("Введённый ИНН не прошёл проверку по контрольным цифрам");<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
==== КПП ====<br />
<br />
<syntaxhighlight line lang="javascript"><br />
function isKPPvalid(sender, args) {<br />
if (args.Value.length != 9) {<br />
//alert("КПП должен представлять собой девятизначный код");<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
if (!args.Value.match(/\d{4}[\dA-Z][\dA-Z]\d{3}/)) {<br />
//alert("КПП не соответствует формату");<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
else {<br />
args.IsValid = true;<br />
return args.IsValid;<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
==== ОГРН ====<br />
<br />
<syntaxhighlight line lang="javascript"><br />
function isOGRNvalid(sender, args) {<br />
// проверка на число<br />
if (args.Value.match(/\D/)) {<br />
//alert("Введённый ОГРН не является числом");<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
// проверка на 13 и 15 цифр<br />
if (args.Value.length != 13 && args.Value.length != 15) {<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
// проверка ОГРН для ЮЛ<br />
if (args.Value.length == 13) {<br />
// проверка по контрольным цифрам<br />
var num12 = args.Value;<br />
num12 = Math.floor((num12 / 10) % 11);<br />
if (num12 == 10) { dgt13 = 0; }<br />
else { dgt13 = num12; }<br />
if (args.Value[12] == dgt13) {<br />
args.IsValid = true;<br />
return args.IsValid;<br />
}<br />
else {<br />
//alert("Введённый ОГРН не прошёл проверку по контрольным цифрам");<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
}<br />
// проверка ОГРН для ИП<br />
if (args.Value.length == 15) {<br />
// проверка по контрольным цифрам<br />
var num14 = args.Value;<br />
num14 = Math.floor((num14 / 10) % 13);<br />
if (num14 == 10) { dgt15 = 0; }<br />
else { dgt15 = num14; }<br />
if (args.Value[14] == dgt15) {<br />
args.IsValid = true;<br />
return args.IsValid;<br />
}<br />
else {<br />
//alert("Введённый ОГРН не прошёл проверку по контрольным цифрам");<br />
args.IsValid = false;<br />
return args.IsValid;<br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
[[Категория:Продлёнка]]<br />
[[Категория:C Sharp]]<br />
[[Категория:JavaScript]]</div>
217.14.52.2
https://iu5bmstu.ru/index.php?title=%D0%9F%D0%B5%D1%81%D0%BE%D1%87%D0%BD%D0%B8%D1%86%D0%B0&diff=4516
Песочница
2013-11-28T11:15:17Z
<p>217.14.52.2: </p>
<hr />
<div>Тут можно готовить куличики и строить замки.<br />
<br />
== Формулы ==<br />
<br />
{{Формула|f=\int\limits_a^x f\left(\frac{\alpha}{2}\,\right)\,dx}}<br />
<br />
<math>x^2-y=z</math><br />
<br />
<math>e=mc^2</math><br />
<br />
{{Формула|f=72\cdot\sigma^2-23=\beta_3\cdot\frac{2+2\cdot2}{f^2-g^3} }}<br />
<br />
{{Формула|f=3x-y^{23}=3}}<br />
<br />
== Подсветка кода ==<br />
<br />
<syntaxhighlight line lang="cpp-qt"><br />
#include <QtGui/QApplication><br />
#include <QTextCodec><br />
#include "mainwindow.h"<br />
<br />
int main(int argc, char *argv[])<br />
{<br />
QApplication a(argc, argv);<br />
<br />
// кодировка текста для tr()<br />
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));<br />
<br />
MainWindow w;<br />
w.setWindowTitle(QString::fromUtf8("Суперское мегоприложение"));<br />
w.show();<br />
<br />
return a.exec();<br />
}<br />
</syntaxhighlight><br />
<br />
== SVG ==<br />
<br />
[[Файл:Svg.svg]]<br />
<br />
== Сноски ==<br />
<br />
According to scientists, the Sun is pretty big.<ref>E. Miller, The Sun, (New York: Academic Press, 2005), 23-5.</ref><br />
<br />
The Moon, however, is not so big.<ref>R. Smith, "Size of the Moon", Scientific American, 46 (April 1978): 44-6.</ref><br />
<br />
== Примечания ==<br />
<br />
<references /><br />
<br />
== Всякие эксперименты ==<br />
<br />
=== Размер шрифта ===<br />
<br />
<font size="1px">1px</font><br />
<br />
<font size="3px">3px</font><br />
<br />
<font size="5px">5px</font><br />
<br />
<font size="7px">7px</font><br />
<br />
=== Сворачиваемый текст ===<br />
<br />
<div class="toccolours mw-collapsible mw-collapsed" style="width:250px"><br />
Видимая часть текста<div class="mw-collapsible-content">невидимая часть текста, ололо</div><br />
</div><br />
<br />
research.microsoft.com/en-us/downloads/d02f3198-7896-45eb-89e8-5a75859b67c8/</div>
217.14.52.2
https://iu5bmstu.ru/index.php?title=%D0%9F%D0%B5%D1%81%D0%BE%D1%87%D0%BD%D0%B8%D1%86%D0%B0&diff=4106
Песочница
2013-08-29T13:12:19Z
<p>217.14.52.2: /* Сворачиваемый текст */</p>
<hr />
<div>Тут можно готовить куличики и строить замки.<br />
<br />
== Формулы ==<br />
<br />
{{Формула|f=\int\limits_a^x f\left(\frac{\alpha}{2}\,\right)\,dx}}<br />
<br />
<math>x^2-y=z</math><br />
<br />
<math>e=mc^2</math><br />
<br />
{{Формула|f=72\cdot\sigma^2-23=\beta_3\cdot\frac{2+2\cdot2}{f^2-g^3} }}<br />
<br />
{{Формула|f=3x-y^{23}=3}}<br />
<br />
== Подсветка кода ==<br />
<br />
<syntaxhighlight line lang="cpp-qt"><br />
#include <QtGui/QApplication><br />
#include <QTextCodec><br />
#include "mainwindow.h"<br />
<br />
int main(int argc, char *argv[])<br />
{<br />
QApplication a(argc, argv);<br />
<br />
// кодировка текста для tr()<br />
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));<br />
<br />
MainWindow w;<br />
w.setWindowTitle(QString::fromUtf8("Суперское мегоприложение"));<br />
w.show();<br />
<br />
return a.exec();<br />
}<br />
</syntaxhighlight><br />
<br />
== SVG ==<br />
<br />
[[Файл:Svg.svg]]<br />
<br />
== Сноски ==<br />
<br />
According to scientists, the Sun is pretty big.<ref>E. Miller, The Sun, (New York: Academic Press, 2005), 23-5.</ref><br />
<br />
The Moon, however, is not so big.<ref>R. Smith, "Size of the Moon", Scientific American, 46 (April 1978): 44-6.</ref><br />
<br />
== Примечания ==<br />
<br />
<references /><br />
<br />
== Всякие эксперименты ==<br />
<br />
=== Размер шрифта ===<br />
<br />
<font size="1px">1px</font><br />
<br />
<font size="3px">3px</font><br />
<br />
<font size="5px">5px</font><br />
<br />
<font size="7px">7px</font><br />
<br />
=== Сворачиваемый текст ===<br />
<br />
<div class="toccolours mw-collapsible mw-collapsed" style="width:250px"><br />
Видимая часть текста<div class="mw-collapsible-content">невидимая часть текста, ололо</div><br />
</div></div>
217.14.52.2
https://iu5bmstu.ru/index.php?title=%D0%9F%D0%B5%D1%81%D0%BE%D1%87%D0%BD%D0%B8%D1%86%D0%B0&diff=4105
Песочница
2013-08-29T13:10:55Z
<p>217.14.52.2: /* Сворачиваемый текст */</p>
<hr />
<div>Тут можно готовить куличики и строить замки.<br />
<br />
== Формулы ==<br />
<br />
{{Формула|f=\int\limits_a^x f\left(\frac{\alpha}{2}\,\right)\,dx}}<br />
<br />
<math>x^2-y=z</math><br />
<br />
<math>e=mc^2</math><br />
<br />
{{Формула|f=72\cdot\sigma^2-23=\beta_3\cdot\frac{2+2\cdot2}{f^2-g^3} }}<br />
<br />
{{Формула|f=3x-y^{23}=3}}<br />
<br />
== Подсветка кода ==<br />
<br />
<syntaxhighlight line lang="cpp-qt"><br />
#include <QtGui/QApplication><br />
#include <QTextCodec><br />
#include "mainwindow.h"<br />
<br />
int main(int argc, char *argv[])<br />
{<br />
QApplication a(argc, argv);<br />
<br />
// кодировка текста для tr()<br />
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));<br />
<br />
MainWindow w;<br />
w.setWindowTitle(QString::fromUtf8("Суперское мегоприложение"));<br />
w.show();<br />
<br />
return a.exec();<br />
}<br />
</syntaxhighlight><br />
<br />
== SVG ==<br />
<br />
[[Файл:Svg.svg]]<br />
<br />
== Сноски ==<br />
<br />
According to scientists, the Sun is pretty big.<ref>E. Miller, The Sun, (New York: Academic Press, 2005), 23-5.</ref><br />
<br />
The Moon, however, is not so big.<ref>R. Smith, "Size of the Moon", Scientific American, 46 (April 1978): 44-6.</ref><br />
<br />
== Примечания ==<br />
<br />
<references /><br />
<br />
== Всякие эксперименты ==<br />
<br />
=== Размер шрифта ===<br />
<br />
<font size="1px">1px</font><br />
<br />
<font size="3px">3px</font><br />
<br />
<font size="5px">5px</font><br />
<br />
<font size="7px">7px</font><br />
<br />
=== Сворачиваемый текст ===<br />
<br />
<div class="toccolours mw-collapsible mw-collapsed" style="width:250px"><br />
Видимая часть текста<div class="mw-collapsible-content">невидимая часть текста, ололо</div><br />
</div><br />
<br />
<br />
110100011110010111100011111011101110010011101101111111110010000011101010111000001110110111110010111100001110100011110000111100111110010111101100001011000010000011100001111100111110010011111100001000001110001111101110111100101110111011100010001000001110111111101110111100011110101111100101001000001111000111100101111011001110100000101110</div>
217.14.52.2
https://iu5bmstu.ru/index.php?title=%D0%9F%D0%B5%D1%81%D0%BE%D1%87%D0%BD%D0%B8%D1%86%D0%B0&diff=4104
Песочница
2013-08-29T12:59:56Z
<p>217.14.52.2: /* Сворачиваемый текст */</p>
<hr />
<div>Тут можно готовить куличики и строить замки.<br />
<br />
== Формулы ==<br />
<br />
{{Формула|f=\int\limits_a^x f\left(\frac{\alpha}{2}\,\right)\,dx}}<br />
<br />
<math>x^2-y=z</math><br />
<br />
<math>e=mc^2</math><br />
<br />
{{Формула|f=72\cdot\sigma^2-23=\beta_3\cdot\frac{2+2\cdot2}{f^2-g^3} }}<br />
<br />
{{Формула|f=3x-y^{23}=3}}<br />
<br />
== Подсветка кода ==<br />
<br />
<syntaxhighlight line lang="cpp-qt"><br />
#include <QtGui/QApplication><br />
#include <QTextCodec><br />
#include "mainwindow.h"<br />
<br />
int main(int argc, char *argv[])<br />
{<br />
QApplication a(argc, argv);<br />
<br />
// кодировка текста для tr()<br />
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));<br />
<br />
MainWindow w;<br />
w.setWindowTitle(QString::fromUtf8("Суперское мегоприложение"));<br />
w.show();<br />
<br />
return a.exec();<br />
}<br />
</syntaxhighlight><br />
<br />
== SVG ==<br />
<br />
[[Файл:Svg.svg]]<br />
<br />
== Сноски ==<br />
<br />
According to scientists, the Sun is pretty big.<ref>E. Miller, The Sun, (New York: Academic Press, 2005), 23-5.</ref><br />
<br />
The Moon, however, is not so big.<ref>R. Smith, "Size of the Moon", Scientific American, 46 (April 1978): 44-6.</ref><br />
<br />
== Примечания ==<br />
<br />
<references /><br />
<br />
== Всякие эксперименты ==<br />
<br />
=== Размер шрифта ===<br />
<br />
<font size="1px">1px</font><br />
<br />
<font size="3px">3px</font><br />
<br />
<font size="5px">5px</font><br />
<br />
<font size="7px">7px</font><br />
<br />
=== Сворачиваемый текст ===<br />
<br />
<div class="toccolours mw-collapsible mw-collapsed" style="width:250px"><br />
Видимая часть текста<div class="mw-collapsible-content">невидимая часть текста, ололо</div><br />
</div><br />
<br />
<br />
110100111111011111101000001000001110110011100000111100101111011111100000111100011111001011111100001011000010000011101011111011101111100011100000111100001110000000101110</div>
217.14.52.2