Проблема при проверке ИНН в Internet Explorer 6 и 7

В формах ввода очень часто приходится проверять контрольные суммы для ИНН. Делается это довольно просто, достаточно сложить знаки перемноженные на коэффициенты. Правила описаны здесь.

В итоге для вычисления контрольной суммы получаем нечто подобное:

var inn = "1234567890"; //это не число, т.к. с формы мы получим строку

kontrolSumm = (2*inn[0] + 4*inn[1] + 10*inn[2] + 3*inn[3] + 5*inn[4] + 9*inn[5] + 4*inn[6] + 6*inn[7] + 8*inn[8])%11;

Во всех нормальных браузерах этот код работать будет, но только не в Internet Explorer 6 и 7 (а также в IE8 в режиме совместимости). Здесь мы обращаемся к строке как к массиву, но как выяснилось, IE6 не позволяет этого делать. Это довольно странно, т.к. во всех руководствах по JavaScript которые я видел было сказано, что строка представляет собой массив символов в кодировке Unicode.

Обойти эту неприятную особенность просто. Достаточно принудительно создать массив из строки c помощью метода .split().

var inn = "1234567890"; //это не число, т.к. с формы м получим строку
inn = inn.split('');//преобразуем в массив

kontrolSumm = (2*inn[0] + 4*inn[1] + 10*inn[2] + 3*inn[3] + 5*inn[4] + 9*inn[5] + 4*inn[6] + 6*inn[7] + 8*inn[8])%11;

Я не нашел в сети упоминаний об этом баге, так что решил написать, вдруг кому пригодится =)

3 комментария

Antonio
Jaqen

я бы еще каждый в Number(inn…) обернул для надёжности…

Ответить

Морозов Максим

Это лишнеее, т.к. если где-то будет не целое число то контрольная строка не сойдётся.

Ответить

Ваш отзыв

logo