2014-02-21 3 views
12

Привет, мне нужно сделать Проверка проверки IBAN с использованием javascript.Проверка проверки IBAN

правила я должен следовать является

Проверки на IBAN An IBAN проверяется путем преобразования его в целое число и выполнения основной Mod-97 операций (как описано в ISO 7064) на нем. Если IBAN действительно, остаток равен 1.

.Проверить, что общая длина IBAN является правильным согласно стране. Если нет, то IBAN является недействительным

.Привести четыре начальных символов до конца строки

.Привернуть каждую букву в строке с двумя цифрами, тем самым расширяя строку, где а = 10, в = 11, ..., Z = 35

.Interpret строка в виде десятичного целого числа и вычислить остаток от этого числа при делении на 97

Я делал это в течениеБелорусский IBAN поэтому он должен следовать следующий формат

2C 31N -

RU1230000000000000000000000000000

Как я могу изменить следующие для удовлетворения вышеуказанных правил;

function validateIBAN(iban) { 
    var newIban = iban.toUpperCase(), 
     modulo = function (divident, divisor) { 
      var cDivident = ''; 
      var cRest = ''; 

      for (var i in divident) { 
       var cChar = divident[i]; 
       var cOperator = cRest + '' + cDivident + '' + cChar; 

       if (cOperator < parseInt(divisor)) { 
         cDivident += '' + cChar; 
       } else { 
         cRest = cOperator % divisor; 
         if (cRest == 0) { 
          cRest = ''; 
         } 
         cDivident = ''; 
       } 

      } 
      cRest += '' + cDivident; 
      if (cRest == '') { 
       cRest = 0; 
      } 
      return cRest; 
     }; 

    if (newIban.search(/^[A-Z]{2}/gi) < 0) { 
     return false; 
    } 

    newIban = newIban.substring(4) + newIban.substring(0, 4); 

    newIban = newIban.replace(/[A-Z]/g, function (match) { 
     return match.charCodeAt(0) - 55; 
    }); 

    return parseInt(modulo(newIban, 97), 10) === 1; 
} 

ответ

19

Вы можете использовать эту библиотеку для проверки и форматирования IBAN: https://github.com/arhs/iban.js (отказ от ответственности: я написал библиотека)

Однако ни Россия, ни Беларусь не поддерживается, так как я не могу найти ни одного упоминания о эти страны на IBAN page of wikipedia или в official IBAN registry, так что, боюсь, вам придется самостоятельно изменить код библиотеки, чтобы добавить его.

+1

этот код не может подтвердить молдавскую IBAN. например, 'MD75EX0900002374642125EU'. согласно www.iban.com действительно – armen

+0

Спасибо @armen. Проблема open (https://github.com/arhs/iban.js/issues/23) скоро исправит ее. –

+0

очень хороший @Laurent VB, есть ли список рассылки, чтобы сообщить мне после этого исправления? – armen

13

Основываясь на работе http://toms-cafe.de/iban/iban.js я разработал свою версию проверки IBAN.

Вы можете изменить поддержку страны, изменив переменную CODE_LENGTHS

Вот моя реализация:

function alertValidIBAN(iban) { 
    alert(isValidIBANNumber(iban)); 
} 
/* 
* Returns 1 if the IBAN is valid 
* Returns FALSE if the IBAN's length is not as should be (for CY the IBAN Should be 28 chars long starting with CY) 
* Returns any other number (checksum) when the IBAN is invalid (check digits do not match) 
*/ 
function isValidIBANNumber(input) { 
    var CODE_LENGTHS = { 
     AD: 24, AE: 23, AT: 20, AZ: 28, BA: 20, BE: 16, BG: 22, BH: 22, BR: 29, 
     CH: 21, CR: 21, CY: 28, CZ: 24, DE: 22, DK: 18, DO: 28, EE: 20, ES: 24, 
     FI: 18, FO: 18, FR: 27, GB: 22, GI: 23, GL: 18, GR: 27, GT: 28, HR: 21, 
     HU: 28, IE: 22, IL: 23, IS: 26, IT: 27, JO: 30, KW: 30, KZ: 20, LB: 28, 
     LI: 21, LT: 20, LU: 20, LV: 21, MC: 27, MD: 24, ME: 22, MK: 19, MR: 27, 
     MT: 31, MU: 30, NL: 18, NO: 15, PK: 24, PL: 28, PS: 29, PT: 25, QA: 29, 
     RO: 24, RS: 22, SA: 24, SE: 24, SI: 19, SK: 24, SM: 27, TN: 24, TR: 26 
    }; 
    var iban = String(input).toUpperCase().replace(/[^A-Z0-9]/g, ''), // keep only alphanumeric characters 
      code = iban.match(/^([A-Z]{2})(\d{2})([A-Z\d]+)$/), // match and capture (1) the country code, (2) the check digits, and (3) the rest 
      digits; 
    // check syntax and length 
    if (!code || iban.length !== CODE_LENGTHS[code[1]]) { 
     return false; 
    } 
    // rearrange country code and check digits, and convert chars to ints 
    digits = (code[3] + code[1] + code[2]).replace(/[A-Z]/g, function (letter) { 
     return letter.charCodeAt(0) - 55; 
    }); 
    // final check 
    return mod97(digits); 
} 
function mod97(string) { 
    var checksum = string.slice(0, 2), fragment; 
    for (var offset = 2; offset < string.length; offset += 7) { 
     fragment = String(checksum) + string.substring(offset, offset + 7); 
     checksum = parseInt(fragment, 10) % 97; 
    } 
    return checksum; 
} 

Здесь также работает fiddle

+0

Кажется, отлично работает. Добавлено несколько кодов стран, и поскольку это метод проверки, я думаю, он должен возвращать логическое значение не контрольной суммы. Поэтому я также изменил return на 'return mod97 (цифры) === 1;' –

+0

Это не работает. функция показывает этот ES33208058011430aaaaaaa как действительный ... – Ismaestro

+1

@Ismaestro no, он возвращает '55' -> который согласно описанию 'Возвращает любое другое число (контрольная сумма), когда IBAN недействителен' – MaVRoSCy

Смежные вопросы