@@ -4,126 +4,6 @@ defmodule Bankster.Iban do
44 """
55
66 ## -- Module constants
7- # - IBAN Rules
8- @ iban_rules % {
9- "AA" => % { length: 16 , rule: ~r/ ^[0-9A-Z]{12}$/ i } ,
10- "AD" => % { length: 24 , rule: ~r/ ^[0-9]{8}[0-9A-Z]{12}$/ i } ,
11- "AE" => % { length: 23 , rule: ~r/ ^[0-9]{19}$/ i } ,
12- "AL" => % { length: 28 , rule: ~r/ ^[0-9]{8}[0-9A-Z]{16}$/ i } ,
13- "AO" => % { length: 25 , rule: ~r/ ^[0-9]{21}$/ i } ,
14- "AT" => % { length: 20 , rule: ~r/ ^[0-9]{16}$/ i } ,
15- "AX" => % { length: 18 , rule: ~r/ ^[0-9]{14}$/ i } ,
16- "AZ" => % { length: 28 , rule: ~r/ ^[A-Z]{4}[0-9A-Z]{20}$/ i } ,
17- "BA" => % { length: 20 , rule: ~r/ ^[0-9]{16}$/ i } ,
18- "BE" => % { length: 16 , rule: ~r/ ^[0-9]{12}$/ i } ,
19- "BF" => % { length: 27 , rule: ~r/ ^[0-9]{23}$/ i } ,
20- "BG" => % { length: 22 , rule: ~r/ ^[A-Z]{4}[0-9]{6}[0-9A-Z]{8}$/ i } ,
21- "BH" => % { length: 22 , rule: ~r/ ^[A-Z]{4}[0-9]{14}$/ i } ,
22- "BI" => % { length: 16 , rule: ~r/ ^[0-9]{12}$/ i } ,
23- "BJ" => % { length: 28 , rule: ~r/ ^[A-Z]{1}[0-9]{23}$/ i } ,
24- "BL" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
25- "BR" => % { length: 29 , rule: ~r/ ^[0-9]{23}[A-Z]{1}[0-9A-Z]{1}$/ i } ,
26- "BY" => % { length: 28 , rule: ~r/ ^[0-9A-Z]{4}[0-9]{4}[0-9A-Z]{16}$/ i } ,
27- "CF" => % { length: 27 , rule: ~r/ ^[0-9]{23}$/ i } ,
28- "CG" => % { length: 27 , rule: ~r/ ^[0-9]{23}$/ i } ,
29- "CH" => % { length: 21 , rule: ~r/ ^[0-9]{5}[0-9A-Z]{12}$/ i } ,
30- "CI" => % { length: 28 , rule: ~r/ ^[A-Z]{1}[0-9]{23}$/ i } ,
31- "CM" => % { length: 27 , rule: ~r/ ^[0-9]{23}$/ i } ,
32- "CR" => % { length: 22 , rule: ~r/ ^[0-9]{18}$/ i } ,
33- "CV" => % { length: 25 , rule: ~r/ ^[0-9]{21}$/ i } ,
34- "CY" => % { length: 28 , rule: ~r/ ^[0-9]{8}[0-9A-Z]{16}$/ i } ,
35- "CZ" => % { length: 24 , rule: ~r/ ^[0-9]{20}$/ i } ,
36- "DE" => % { length: 22 , rule: ~r/ ^[0-9]{18}$/ i } ,
37- "DJ" => % { length: 27 , rule: ~r/ ^[0-9]{23}$/ i } ,
38- "DK" => % { length: 18 , rule: ~r/ ^[0-9]{14}$/ i } ,
39- "DO" => % { length: 28 , rule: ~r/ ^[0-9A-Z]{4}[0-9]{20}$/ i } ,
40- "DZ" => % { length: 24 , rule: ~r/ ^[0-9]{20}$/ i } ,
41- "EE" => % { length: 20 , rule: ~r/ ^[0-9]{16}$/ i } ,
42- "EG" => % { length: 27 , rule: ~r/ ^[0-9]{23}$/ i } ,
43- "ES" => % { length: 24 , rule: ~r/ ^[0-9]{20}$/ i } ,
44- "FI" => % { length: 18 , rule: ~r/ ^[0-9]{14}$/ i } ,
45- "FO" => % { length: 18 , rule: ~r/ ^[0-9]{14}$/ i } ,
46- "FR" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
47- "GA" => % { length: 27 , rule: ~r/ ^[0-9]{23}$/ i } ,
48- "GB" => % { length: 22 , rule: ~r/ ^[A-Z]{4}[0-9]{14}$/ i } ,
49- "GE" => % { length: 22 , rule: ~r/ ^[A-Z]{2}[0-9]{16}$/ i } ,
50- "GF" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
51- "GI" => % { length: 23 , rule: ~r/ ^[A-Z]{4}[0-9A-Z]{15}$/ i } ,
52- "GL" => % { length: 18 , rule: ~r/ ^[0-9]{14}$/ i } ,
53- "GP" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
54- "GQ" => % { length: 27 , rule: ~r/ ^[0-9]{23}$/ i } ,
55- "GR" => % { length: 27 , rule: ~r/ ^[0-9]{7}[0-9A-Z]{16}$/ i } ,
56- "GT" => % { length: 28 , rule: ~r/ ^[0-9A-Z]{24}$/ i } ,
57- "GW" => % { length: 25 , rule: ~r/ ^[0-9A-Z]{2}[0-9]{19}$/ i } ,
58- "HN" => % { length: 28 , rule: ~r/ ^[A-Z]{4}[0-9]{20}$/ i } ,
59- "HR" => % { length: 21 , rule: ~r/ ^[0-9]{17}$/ i } ,
60- "HU" => % { length: 28 , rule: ~r/ ^[0-9]{24}$/ i } ,
61- "IE" => % { length: 22 , rule: ~r/ ^[A-Z]{4}[0-9]{14}$/ i } ,
62- "IL" => % { length: 23 , rule: ~r/ ^[0-9]{19}$/ i } ,
63- "IQ" => % { length: 23 , rule: ~r/ ^[0-9A-Z]{4}[0-9]{15}$/ i } ,
64- "IR" => % { length: 26 , rule: ~r/ ^[0-9]{22}$/ i } ,
65- "IS" => % { length: 26 , rule: ~r/ ^[0-9]{22}$/ i } ,
66- "IT" => % { length: 27 , rule: ~r/ ^[A-Z]{1}[0-9]{10}[0-9A-Z]{12}$/ i } ,
67- "JO" => % { length: 30 , rule: ~r/ ^[A-Z]{4}[0-9]{4}[0-9A-Z]{18}$/ i } ,
68- "KM" => % { length: 27 , rule: ~r/ ^[0-9]{23}$/ i } ,
69- "KW" => % { length: 30 , rule: ~r/ ^[A-Z]{4}[0-9]{22}$/ i } ,
70- "KZ" => % { length: 20 , rule: ~r/ ^[0-9]{3}[0-9A-Z]{13}$/ i } ,
71- "LB" => % { length: 28 , rule: ~r/ ^[0-9]{4}[0-9A-Z]{20}$/ i } ,
72- "LC" => % { length: 32 , rule: ~r/ ^[A-Z]{4}[0-9A-Z]{24}$/ i } ,
73- "LI" => % { length: 21 , rule: ~r/ ^[0-9]{5}[0-9A-Z]{12}$/ i } ,
74- "LT" => % { length: 20 , rule: ~r/ ^[0-9]{16}$/ i } ,
75- "LU" => % { length: 20 , rule: ~r/ ^[0-9]{3}[0-9A-Z]{13}$/ i } ,
76- "LV" => % { length: 21 , rule: ~r/ ^[A-Z]{4}[0-9A-Z]{13}$/ i } ,
77- "MA" => % { length: 28 , rule: ~r/ ^[0-9]{24}$/ i } ,
78- "MC" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
79- "MD" => % { length: 24 , rule: ~r/ ^[0-9A-Z]{20}$/ i } ,
80- "ME" => % { length: 22 , rule: ~r/ ^[0-9]{18}$/ i } ,
81- "MF" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
82- "MG" => % { length: 27 , rule: ~r/ ^[0-9]{23}$/ i } ,
83- "MK" => % { length: 19 , rule: ~r/ ^[0-9]{3}[0-9A-Z]{10}[0-9]{2}$/ i } ,
84- "ML" => % { length: 28 , rule: ~r/ ^[A-Z]{1}[0-9]{23}$/ i } ,
85- "MQ" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
86- "MR" => % { length: 27 , rule: ~r/ ^[0-9]{23}$/ i } ,
87- "MT" => % { length: 31 , rule: ~r/ ^[A-Z]{4}[0-9]{5}[0-9A-Z]{18}$/ i } ,
88- "MU" => % { length: 30 , rule: ~r/ ^[A-Z]{4}[0-9]{19}[A-Z]{3}$/ i } ,
89- "MZ" => % { length: 25 , rule: ~r/ ^[0-9]{21}$/ i } ,
90- "NC" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
91- "NE" => % { length: 28 , rule: ~r/ ^[A-Z]{2}[0-9]{22}$/ i } ,
92- "NI" => % { length: 32 , rule: ~r/ ^[A-Z]{4}[0-9]{24}$/ i } ,
93- "NL" => % { length: 18 , rule: ~r/ ^[A-Z]{4}[0-9]{10}$/ i } ,
94- "NO" => % { length: 15 , rule: ~r/ ^[0-9]{11}$/ i } ,
95- "PF" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
96- "PK" => % { length: 24 , rule: ~r/ ^[A-Z]{4}[0-9A-Z]{16}$/ i } ,
97- "PL" => % { length: 28 , rule: ~r/ ^[0-9]{24}$/ i } ,
98- "PM" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
99- "PS" => % { length: 29 , rule: ~r/ ^[A-Z]{4}[0-9A-Z]{21}$/ i } ,
100- "PT" => % { length: 25 , rule: ~r/ ^[0-9]{21}$/ i } ,
101- "QA" => % { length: 29 , rule: ~r/ ^[A-Z]{4}[0-9]{4}[0-9A-Z]{17}$/ i } ,
102- "RE" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
103- "RO" => % { length: 24 , rule: ~r/ ^[A-Z]{4}[0-9A-Z]{16}$/ i } ,
104- "RS" => % { length: 22 , rule: ~r/ ^[0-9]{18}$/ i } ,
105- "SA" => % { length: 24 , rule: ~r/ ^[0-9]{2}[0-9A-Z]{18}$/ i } ,
106- "SC" => % { length: 31 , rule: ~r/ ^[A-Z]{4}[0-9]{20}[A-Z]{3}$/ i } ,
107- "SE" => % { length: 24 , rule: ~r/ ^[0-9]{20}$/ i } ,
108- "SI" => % { length: 19 , rule: ~r/ ^[0-9]{15}$/ i } ,
109- "SK" => % { length: 24 , rule: ~r/ ^[0-9]{20}$/ i } ,
110- "SM" => % { length: 27 , rule: ~r/ ^[A-Z]{1}[0-9]{10}[0-9A-Z]{12}$/ i } ,
111- "SN" => % { length: 28 , rule: ~r/ ^[A-Z]{1}[0-9]{23}$/ i } ,
112- "ST" => % { length: 25 , rule: ~r/ ^[0-9]{8}[0-9]{13}$/ i } ,
113- "SV" => % { length: 28 , rule: ~r/ ^[0-9A-Z]{4}[0-9]{20}$/ i } ,
114- "TD" => % { length: 27 , rule: ~r/ ^[0-9]{23}$/ i } ,
115- "TF" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
116- "TG" => % { length: 28 , rule: ~r/ ^[A-Z]{2}[0-9]{22}$/ i } ,
117- "TL" => % { length: 23 , rule: ~r/ ^[0-9]{19}$/ i } ,
118- "TN" => % { length: 24 , rule: ~r/ ^[0-9]{20}$/ i } ,
119- "TR" => % { length: 26 , rule: ~r/ ^[0-9]{6}[0-9A-Z]{16}$/ i } ,
120- "UA" => % { length: 29 , rule: ~r/ ^[0-9]{6}[0-9A-Z]{19}$/ i } ,
121- "VG" => % { length: 24 , rule: ~r/ ^[A-Z]{4}[0-9]{16}$/ i } ,
122- "WF" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
123- "XK" => % { length: 20 , rule: ~r/ ^[0-9]{16}$/ i } ,
124- "YT" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i }
125- }
126-
1277 # - IBAN replacements
1288 @ replacements % {
1299 "A" => "10" ,
@@ -216,7 +96,7 @@ defmodule Bankster.Iban do
21696 ["SM", "KZ", "SN", "BA", "GA", "KW", "MU", ...]
21797 """
21898 @ spec supported_countries :: list ( binary ( ) )
219- def supported_countries , do: Map . keys ( @ iban_rules )
99+ def supported_countries , do: Map . keys ( iban_rules ( ) )
220100
221101 @ doc """
222102 Validates whether the given country code is within the supported countries.
@@ -230,7 +110,7 @@ defmodule Bankster.Iban do
230110 """
231111 @ spec supported_country? ( binary ( ) ) :: boolean ( )
232112 def supported_country? ( country_code ) when is_binary ( country_code ) ,
233- do: Map . has_key? ( @ iban_rules , format_default ( country_code ) )
113+ do: Map . has_key? ( iban_rules ( ) , format_default ( country_code ) )
234114
235115 def supported_country? ( _country_code ) ,
236116 do: false
@@ -330,17 +210,17 @@ defmodule Bankster.Iban do
330210 # - Check whether a given IBAN violates the supported countries.
331211 @ spec iban_violates_country? ( binary ( ) ) :: boolean
332212 defp iban_violates_country? ( iban ) ,
333- do: ! Map . has_key? ( @ iban_rules , country_code ( iban ) )
213+ do: ! Map . has_key? ( iban_rules ( ) , country_code ( iban ) )
334214
335215 # - Check whether a given IBAN violates the required length.
336216 @ spec iban_violates_length? ( binary ( ) ) :: boolean
337217 defp iban_violates_length? ( iban ) ,
338- do: size ( iban ) != get_in ( @ iban_rules , [ country_code ( iban ) , :length ] )
218+ do: size ( iban ) != get_in ( iban_rules ( ) , [ country_code ( iban ) , :length ] )
339219
340220 # - Check whether a given IBAN violates the country rules.
341221 @ spec iban_violates_country_rule? ( binary ( ) ) :: boolean
342222 defp iban_violates_country_rule? ( iban ) do
343- if iban_rule = get_in ( @ iban_rules , [ country_code ( iban ) , :rule ] ) do
223+ if iban_rule = get_in ( iban_rules ( ) , [ country_code ( iban ) , :rule ] ) do
344224 ! Regex . match? ( iban_rule , String . slice ( format_default ( iban ) , 4 .. - 1 // 1 ) )
345225 else
346226 false
@@ -365,4 +245,125 @@ defmodule Bankster.Iban do
365245
366246 calculated_checksum !== checksum ( iban )
367247 end
248+
249+ defp iban_rules do
250+ % {
251+ "AA" => % { length: 16 , rule: ~r/ ^[0-9A-Z]{12}$/ i } ,
252+ "AD" => % { length: 24 , rule: ~r/ ^[0-9]{8}[0-9A-Z]{12}$/ i } ,
253+ "AE" => % { length: 23 , rule: ~r/ ^[0-9]{19}$/ i } ,
254+ "AL" => % { length: 28 , rule: ~r/ ^[0-9]{8}[0-9A-Z]{16}$/ i } ,
255+ "AO" => % { length: 25 , rule: ~r/ ^[0-9]{21}$/ i } ,
256+ "AT" => % { length: 20 , rule: ~r/ ^[0-9]{16}$/ i } ,
257+ "AX" => % { length: 18 , rule: ~r/ ^[0-9]{14}$/ i } ,
258+ "AZ" => % { length: 28 , rule: ~r/ ^[A-Z]{4}[0-9A-Z]{20}$/ i } ,
259+ "BA" => % { length: 20 , rule: ~r/ ^[0-9]{16}$/ i } ,
260+ "BE" => % { length: 16 , rule: ~r/ ^[0-9]{12}$/ i } ,
261+ "BF" => % { length: 27 , rule: ~r/ ^[0-9]{23}$/ i } ,
262+ "BG" => % { length: 22 , rule: ~r/ ^[A-Z]{4}[0-9]{6}[0-9A-Z]{8}$/ i } ,
263+ "BH" => % { length: 22 , rule: ~r/ ^[A-Z]{4}[0-9]{14}$/ i } ,
264+ "BI" => % { length: 16 , rule: ~r/ ^[0-9]{12}$/ i } ,
265+ "BJ" => % { length: 28 , rule: ~r/ ^[A-Z]{1}[0-9]{23}$/ i } ,
266+ "BL" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
267+ "BR" => % { length: 29 , rule: ~r/ ^[0-9]{23}[A-Z]{1}[0-9A-Z]{1}$/ i } ,
268+ "BY" => % { length: 28 , rule: ~r/ ^[0-9A-Z]{4}[0-9]{4}[0-9A-Z]{16}$/ i } ,
269+ "CF" => % { length: 27 , rule: ~r/ ^[0-9]{23}$/ i } ,
270+ "CG" => % { length: 27 , rule: ~r/ ^[0-9]{23}$/ i } ,
271+ "CH" => % { length: 21 , rule: ~r/ ^[0-9]{5}[0-9A-Z]{12}$/ i } ,
272+ "CI" => % { length: 28 , rule: ~r/ ^[A-Z]{1}[0-9]{23}$/ i } ,
273+ "CM" => % { length: 27 , rule: ~r/ ^[0-9]{23}$/ i } ,
274+ "CR" => % { length: 22 , rule: ~r/ ^[0-9]{18}$/ i } ,
275+ "CV" => % { length: 25 , rule: ~r/ ^[0-9]{21}$/ i } ,
276+ "CY" => % { length: 28 , rule: ~r/ ^[0-9]{8}[0-9A-Z]{16}$/ i } ,
277+ "CZ" => % { length: 24 , rule: ~r/ ^[0-9]{20}$/ i } ,
278+ "DE" => % { length: 22 , rule: ~r/ ^[0-9]{18}$/ i } ,
279+ "DJ" => % { length: 27 , rule: ~r/ ^[0-9]{23}$/ i } ,
280+ "DK" => % { length: 18 , rule: ~r/ ^[0-9]{14}$/ i } ,
281+ "DO" => % { length: 28 , rule: ~r/ ^[0-9A-Z]{4}[0-9]{20}$/ i } ,
282+ "DZ" => % { length: 24 , rule: ~r/ ^[0-9]{20}$/ i } ,
283+ "EE" => % { length: 20 , rule: ~r/ ^[0-9]{16}$/ i } ,
284+ "EG" => % { length: 27 , rule: ~r/ ^[0-9]{23}$/ i } ,
285+ "ES" => % { length: 24 , rule: ~r/ ^[0-9]{20}$/ i } ,
286+ "FI" => % { length: 18 , rule: ~r/ ^[0-9]{14}$/ i } ,
287+ "FO" => % { length: 18 , rule: ~r/ ^[0-9]{14}$/ i } ,
288+ "FR" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
289+ "GA" => % { length: 27 , rule: ~r/ ^[0-9]{23}$/ i } ,
290+ "GB" => % { length: 22 , rule: ~r/ ^[A-Z]{4}[0-9]{14}$/ i } ,
291+ "GE" => % { length: 22 , rule: ~r/ ^[A-Z]{2}[0-9]{16}$/ i } ,
292+ "GF" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
293+ "GI" => % { length: 23 , rule: ~r/ ^[A-Z]{4}[0-9A-Z]{15}$/ i } ,
294+ "GL" => % { length: 18 , rule: ~r/ ^[0-9]{14}$/ i } ,
295+ "GP" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
296+ "GQ" => % { length: 27 , rule: ~r/ ^[0-9]{23}$/ i } ,
297+ "GR" => % { length: 27 , rule: ~r/ ^[0-9]{7}[0-9A-Z]{16}$/ i } ,
298+ "GT" => % { length: 28 , rule: ~r/ ^[0-9A-Z]{24}$/ i } ,
299+ "GW" => % { length: 25 , rule: ~r/ ^[0-9A-Z]{2}[0-9]{19}$/ i } ,
300+ "HN" => % { length: 28 , rule: ~r/ ^[A-Z]{4}[0-9]{20}$/ i } ,
301+ "HR" => % { length: 21 , rule: ~r/ ^[0-9]{17}$/ i } ,
302+ "HU" => % { length: 28 , rule: ~r/ ^[0-9]{24}$/ i } ,
303+ "IE" => % { length: 22 , rule: ~r/ ^[A-Z]{4}[0-9]{14}$/ i } ,
304+ "IL" => % { length: 23 , rule: ~r/ ^[0-9]{19}$/ i } ,
305+ "IQ" => % { length: 23 , rule: ~r/ ^[0-9A-Z]{4}[0-9]{15}$/ i } ,
306+ "IR" => % { length: 26 , rule: ~r/ ^[0-9]{22}$/ i } ,
307+ "IS" => % { length: 26 , rule: ~r/ ^[0-9]{22}$/ i } ,
308+ "IT" => % { length: 27 , rule: ~r/ ^[A-Z]{1}[0-9]{10}[0-9A-Z]{12}$/ i } ,
309+ "JO" => % { length: 30 , rule: ~r/ ^[A-Z]{4}[0-9]{4}[0-9A-Z]{18}$/ i } ,
310+ "KM" => % { length: 27 , rule: ~r/ ^[0-9]{23}$/ i } ,
311+ "KW" => % { length: 30 , rule: ~r/ ^[A-Z]{4}[0-9]{22}$/ i } ,
312+ "KZ" => % { length: 20 , rule: ~r/ ^[0-9]{3}[0-9A-Z]{13}$/ i } ,
313+ "LB" => % { length: 28 , rule: ~r/ ^[0-9]{4}[0-9A-Z]{20}$/ i } ,
314+ "LC" => % { length: 32 , rule: ~r/ ^[A-Z]{4}[0-9A-Z]{24}$/ i } ,
315+ "LI" => % { length: 21 , rule: ~r/ ^[0-9]{5}[0-9A-Z]{12}$/ i } ,
316+ "LT" => % { length: 20 , rule: ~r/ ^[0-9]{16}$/ i } ,
317+ "LU" => % { length: 20 , rule: ~r/ ^[0-9]{3}[0-9A-Z]{13}$/ i } ,
318+ "LV" => % { length: 21 , rule: ~r/ ^[A-Z]{4}[0-9A-Z]{13}$/ i } ,
319+ "MA" => % { length: 28 , rule: ~r/ ^[0-9]{24}$/ i } ,
320+ "MC" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
321+ "MD" => % { length: 24 , rule: ~r/ ^[0-9A-Z]{20}$/ i } ,
322+ "ME" => % { length: 22 , rule: ~r/ ^[0-9]{18}$/ i } ,
323+ "MF" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
324+ "MG" => % { length: 27 , rule: ~r/ ^[0-9]{23}$/ i } ,
325+ "MK" => % { length: 19 , rule: ~r/ ^[0-9]{3}[0-9A-Z]{10}[0-9]{2}$/ i } ,
326+ "ML" => % { length: 28 , rule: ~r/ ^[A-Z]{1}[0-9]{23}$/ i } ,
327+ "MQ" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
328+ "MR" => % { length: 27 , rule: ~r/ ^[0-9]{23}$/ i } ,
329+ "MT" => % { length: 31 , rule: ~r/ ^[A-Z]{4}[0-9]{5}[0-9A-Z]{18}$/ i } ,
330+ "MU" => % { length: 30 , rule: ~r/ ^[A-Z]{4}[0-9]{19}[A-Z]{3}$/ i } ,
331+ "MZ" => % { length: 25 , rule: ~r/ ^[0-9]{21}$/ i } ,
332+ "NC" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
333+ "NE" => % { length: 28 , rule: ~r/ ^[A-Z]{2}[0-9]{22}$/ i } ,
334+ "NI" => % { length: 32 , rule: ~r/ ^[A-Z]{4}[0-9]{24}$/ i } ,
335+ "NL" => % { length: 18 , rule: ~r/ ^[A-Z]{4}[0-9]{10}$/ i } ,
336+ "NO" => % { length: 15 , rule: ~r/ ^[0-9]{11}$/ i } ,
337+ "PF" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
338+ "PK" => % { length: 24 , rule: ~r/ ^[A-Z]{4}[0-9A-Z]{16}$/ i } ,
339+ "PL" => % { length: 28 , rule: ~r/ ^[0-9]{24}$/ i } ,
340+ "PM" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
341+ "PS" => % { length: 29 , rule: ~r/ ^[A-Z]{4}[0-9A-Z]{21}$/ i } ,
342+ "PT" => % { length: 25 , rule: ~r/ ^[0-9]{21}$/ i } ,
343+ "QA" => % { length: 29 , rule: ~r/ ^[A-Z]{4}[0-9]{4}[0-9A-Z]{17}$/ i } ,
344+ "RE" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
345+ "RO" => % { length: 24 , rule: ~r/ ^[A-Z]{4}[0-9A-Z]{16}$/ i } ,
346+ "RS" => % { length: 22 , rule: ~r/ ^[0-9]{18}$/ i } ,
347+ "SA" => % { length: 24 , rule: ~r/ ^[0-9]{2}[0-9A-Z]{18}$/ i } ,
348+ "SC" => % { length: 31 , rule: ~r/ ^[A-Z]{4}[0-9]{20}[A-Z]{3}$/ i } ,
349+ "SE" => % { length: 24 , rule: ~r/ ^[0-9]{20}$/ i } ,
350+ "SI" => % { length: 19 , rule: ~r/ ^[0-9]{15}$/ i } ,
351+ "SK" => % { length: 24 , rule: ~r/ ^[0-9]{20}$/ i } ,
352+ "SM" => % { length: 27 , rule: ~r/ ^[A-Z]{1}[0-9]{10}[0-9A-Z]{12}$/ i } ,
353+ "SN" => % { length: 28 , rule: ~r/ ^[A-Z]{1}[0-9]{23}$/ i } ,
354+ "ST" => % { length: 25 , rule: ~r/ ^[0-9]{8}[0-9]{13}$/ i } ,
355+ "SV" => % { length: 28 , rule: ~r/ ^[0-9A-Z]{4}[0-9]{20}$/ i } ,
356+ "TD" => % { length: 27 , rule: ~r/ ^[0-9]{23}$/ i } ,
357+ "TF" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
358+ "TG" => % { length: 28 , rule: ~r/ ^[A-Z]{2}[0-9]{22}$/ i } ,
359+ "TL" => % { length: 23 , rule: ~r/ ^[0-9]{19}$/ i } ,
360+ "TN" => % { length: 24 , rule: ~r/ ^[0-9]{20}$/ i } ,
361+ "TR" => % { length: 26 , rule: ~r/ ^[0-9]{6}[0-9A-Z]{16}$/ i } ,
362+ "UA" => % { length: 29 , rule: ~r/ ^[0-9]{6}[0-9A-Z]{19}$/ i } ,
363+ "VG" => % { length: 24 , rule: ~r/ ^[A-Z]{4}[0-9]{16}$/ i } ,
364+ "WF" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i } ,
365+ "XK" => % { length: 20 , rule: ~r/ ^[0-9]{16}$/ i } ,
366+ "YT" => % { length: 27 , rule: ~r/ ^[0-9]{10}[0-9A-Z]{11}[0-9]{2}$/ i }
367+ }
368+ end
368369end
0 commit comments