-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathiban.js
108 lines (108 loc) · 2.54 KB
/
iban.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
module.exports = {
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,
AL: 28,
BY: 28,
CR: 22,
EG: 29,
GE: 22,
IQ: 23,
LC: 32,
SC: 31,
ST: 25,
SV: 28,
TL: 23,
UA: 29,
VA: 22,
VG: 24,
XK: 20
};
var iban = String(input).toUpperCase().replace(/[^A-Z0-9]/g, ''),
code = iban.match(
/^([A-Z]{2})(\d{2})([A-Z\d]+)$/
),
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 module.exports.mod97(digits);
},
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;
}
}