2014-02-21 108 views
12

嗨,我需要做一个IBAN验证检查使用javascriptIBAN验证检查

我需要遵循的规则是

验证IBAN 的IBAN通过将其转换成一个整数,执行基本MOD-97操作它(如ISO 7064中所述)进行验证。如果IBAN有效,则余数等于 1.

。检查IBAN的总长度是否正确。如果不是,则IBAN无效

.Move四个初始字符的字符串

.Replace串中的每个字母有两个数字,的端部从而扩大字符串,其中A = 10,B = 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。问题打开(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

似乎很好。增加了一些国家代码,由于它是一个验证方法,我猜它应该返回布尔值而不是校验和值。所以我也改变了返回'返回mod97(数字)=== 1;' –

+0

这是行不通的。函数显示此ES33208058011430aaaaaaaa有效... – Ismaestro

+1

@Ismaestro不,它返回'55' - >根据描述'当IBAN无效时返回任何其他数字(校验和)' – MaVRoSCy