// NibblePoker - IBAN Generator // Author: Herwin Bozet (@NibblePoker) // License: Public Domain (This code) // Sources: // * https://www.swift.com/standards/data-standards/iban-international-bank-account-number (Updated December 2024) export class Iban { /** @type {string} */ countryCode; /** @type {number} */ checksum; /** @type {string[]} */ parts; /** @type {IbanSpecification|null} */ relevantSpec; } export class IbanSpecification { /** * ISO-3166 Country Code * @type {string} */ countryCode; /** @type {string} */ countryName; /** @type {number} */ ibanLength; /** @type {string} */ ibanFormat; /** @type {number} */ bbanLength; /** @type {string} */ bbanFormat; /** @type {RegExp} */ ibanRegex; /** @type {boolean} */ isSepa; /** * @param countryCode {string} * @param countryName {string} * @param ibanLength {number} * @param ibanFormat {string} * @param bbanLength {number} * @param bbanFormat {string} * @param ibanRegex {RegExp} * @param isSepa {boolean} */ constructor(countryCode, countryName, ibanLength, ibanFormat, bbanLength, bbanFormat, ibanRegex, isSepa) { this.countryCode = countryCode; this.countryName = countryName; this.ibanLength = ibanLength; this.ibanFormat = ibanFormat; this.bbanLength = bbanLength; this.bbanFormat = bbanFormat; this.ibanRegex = ibanRegex; this.isSepa = isSepa; } /** * Returns the Bank Identifier from the given IBAN. * The Bank Identifier may or may not include the Branch Identifier. * @param iban {string} * @returns {string} */ getFormattedBankId(iban) { return ""; } /** * @param iban {string} * @returns {string} */ getFormattedBranchId(iban) { return ""; } /** * Formats the IBAN by adding spaces and other characters where necessary. * @param iban {string} * @returns {string} */ getFormattedIban(iban) { return iban.match(/.{1,4}/g).join(' '); } } export const countriesIbanSpecs = { AD: new IbanSpecification( "AD", 'Andorra', 24, "AD2!n4!n4!n12!c", 20, "4!n4!n12!c", new RegExp( "^(?AD)" + "(?[0-9]{2})" + "(?" + "(?[0-9]{4})" + "(?[0-9]{4})" + "([0-9a-zA-Z]{12})" + ")$", "g"), true ), AE: new IbanSpecification( "AE", 'United Arab Emirates (The)', 23, "AE2!n3!n16!n", 19, "3!n16!n", new RegExp( "^(?AE)" + "(?[0-9]{2})" + "(?" + "(?[0-9]{3})" + "([0-9]{16})" + ")$", "g"), false ), AL: new IbanSpecification( "AL", 'Albania', 28, "AL2!n8!n16!c", 24, "8!n16!c", new RegExp( "^(?AL)" + "(?[0-9]{2})" + "(?" + "(?" + "[0-9]{3}" + "(?[0-9]{4})" + "[0-9]{1}" + ")" + "([0-9a-zA-Z]{16})" + ")$", "g"), false // FIXME: Has a special bank id format "212-1100-9" ), AT: new IbanSpecification( "AT", 'Austria', 20, "AT2!n5!n11!n", 16, "5!n11!n", new RegExp( "^(?AT)" + "(?[0-9]{2})" + "(?" + "(?[0-9]{5})" + "([0-9]{11})" + ")$", "g"), true ), AZ: new IbanSpecification( "AZ", 'Azerbaijan', 28, "AZ2!n4!a20!c", 24, "4!a20!c", new RegExp( "^(?AZ)" + "(?[0-9]{2})" + "(?" + "(?[A-Z]{4})" + "([0-9a-zA-Z]{20})" + ")$", "g"), false ), BA: new IbanSpecification( "BA", 'Bosnia and Herzegovina', 20, "BA2!n3!n3!n8!n2!n", 16, "3!n3!n8!n2!n", new RegExp( "^(?BA)" + "(?[0-9]{2})" + "(?" + "(?[0-9]{3})" + "(?[0-9]{3})" + "([0-9]{8})" + "([0-9]{2})" + ")$", "g"), false ), BE: new IbanSpecification( "BE", 'Belgium', 16, "BE2!n3!n7!n2!n", 12, "3!n7!n2!n", new RegExp( "^(?BE)" + "(?[0-9]{2})" + "(?" + "(?[0-9]{3})" + "([0-9]{7})" + "([0-9]{2})" + ")$", "g"), true ), BG: new IbanSpecification( "BG", 'Bulgaria', 22, "BG2!n4!a4!n2!n8!c", 18, "4!a4!n2!n8!c", new RegExp( "^(?BG)" + "(?[0-9]{2})" + "(?" + "(?[A-Z]{4})" + "(?[0-9]{4})" + "([0-9]{2})" + "([0-9a-zA-Z]{8})" + ")$", "g"), true ), BH: new IbanSpecification( "BH", 'Bahrain', 22, "BH2!n4!a14!c", 18, "4!a14!c", new RegExp( "^(?BH)" + "(?[0-9]{2})" + "(?" + "(?[A-Z]{4})" + "([0-9a-zA-Z]{14})" + ")$", "g"), false ), BI: Object.assign(new IbanSpecification( "BI", 'Burundi', 27, "BI2!n5!n5!n11!n2!n", 23, "5!n5!n11!n2!n", new RegExp( "^(?BI)" + "(?[0-9]{2})" + "(?" + "(?[0-9]{5})" + "(?[0-9]{5})" + "([0-9]{11})" + "([0-9]{2})" + ")$", "g"), false ), { getFormattedIban(iban) { return [ iban.substring(0, 4), iban.substring(4, 9), iban.substring(9, 14), iban.substring(14, 25), iban.substring(25, 27), ].join(' '); } }), BR: new IbanSpecification( "BR", 'Brazil', 29, "BR2!n8!n5!n10!n1!a1!c", 25, "8!n5!n10!n1!a1!c", new RegExp( "^(?BR)" + "(?[0-9]{2})" + "(?" + "(?[0-9]{8})" + "(?[0-9]{5})" + "([0-9]{10})" + "([A-Z])" + "([0-9a-zA-Z])" + ")$", "g"), false ), BY: new IbanSpecification( "BY", 'Republic of Belarus\n', 28, "BY2!n4!c4!n16!c", 24, "4!c4!n16!c", new RegExp( "^(?BY)" + "(?[0-9]{2})" + "(?" + "(?[0-9a-zA-Z]{4})" + "([0-9]{4})" + "([0-9a-zA-Z]{16})" + ")$", "g"), false ), CH: new IbanSpecification( "CH", 'Switzerland', 21, "CH2!n5!n12!c", 17, "5!n12!c", new RegExp( "^(?CH)" + "(?[0-9]{2})" + "(?" + "(?[0-9]{5})" + "([0-9a-zA-Z]{12})" + ")$", "g"), true ), CR: new IbanSpecification( "CR", 'Costa Rica', 22, "CR2!n4!n14!n", 18, "4!n14!n", new RegExp( "^(?CR)" + "(?[0-9]{2})" + "(?" + "(?[0-9]{4})" + "([0-9]{14})" + ")$", "g"), false ), CY: new IbanSpecification( "CY", 'Cyprus', 28, "CY2!n3!n5!n16!c", 24, "3!n5!n16!c", new RegExp( "^(?CY)" + "(?[0-9]{2})" + "(?" + "(?[0-9]{3})" + "(?[0-9]{5})" + "([0-9a-zA-Z]{16})" + ")$", "g"), true ), CZ: new IbanSpecification( "CZ", 'Czech Republic', 24, "CZ2!n4!n6!n10!n\n", 20, "4!n6!n10!n", new RegExp( "^(?CZ)" + "(?[0-9]{2})" + "(?" + "(?[0-9]{4})" + "([0-9]{6})" + "([0-9]{10})" + ")$", "g"), true ), DE: new IbanSpecification( "DE", 'Germany', 22, "DE2!n8!n10!n\n", 18, "8!n10!n", new RegExp( "^(?DE)" + "(?[0-9]{2})" + "(?" + "(?[0-9]{8})" + "([0-9]{10})" + ")$", "g"), true ), DJ: new IbanSpecification( "DJ", 'Djibouti', 27, "DJ2!n5!n5!n11!n2!n\n", 23, "5!n5!n11!n2!n\n", new RegExp( "^(?DJ)" + "(?[0-9]{2})" + "(?" + "(?[0-9]{5})" + "(?[0-9]{5})" + "([0-9]{11})" + "([0-9]{2})" + ")$", "g"), false ), DK: new IbanSpecification( "DK", 'Denmark', 18, "DK2!n4!n9!n1!n", 14, "4!n9!n1!n", new RegExp( "^(?DK)" + "(?[0-9]{2})" + "(?" + "(?[0-9]{4})" + "([0-9]{9})" + "([0-9])" + ")$", "g"), true ), DO: new IbanSpecification( "DO", 'Dominican Republic', 28, "DO2!n4!c20!n", 24, "4!c20!n", new RegExp( "^(?DO)" + "(?[0-9]{2})" + "(?" + "(?[A-Z]{4})" + "([0-9]{20})" + ")$", "g"), false ), EE: new IbanSpecification( "EE", 'Estonia', 20, "EE2!n2!n14!n", 16, "2!n14!n", new RegExp( "^(?EE)" + "(?[0-9]{2})" + "(?" + "(?[0-9]{2})" + "([0-9]{14})" + ")$", "g"), true ), EG: Object.assign(new IbanSpecification( "EG", 'Egypt', 29, "EG2!n4!n4!n17!n", 25, "4!n4!n17!n", new RegExp( "^(?EG)" + "(?[0-9]{2})" + "(?" + "(?[0-9]{4})" + "(?[0-9]{4})" + "([0-9]{17})" + ")$", "g"), false ), { getFormattedIban(iban) { return iban; } }), ES: new IbanSpecification( "ES", 'Spain', 24, "4!n4!n1!n1!n10!n", 20, "ES2!n4!n4!n1!n1!n10!n", new RegExp( "^(?ES)" + "(?[0-9]{2})" + "(?" + "(?[0-9]{4})" + "(?[0-9]{4})" + "([0-9])" + "([0-9])" + "([0-9]{10})" + ")$", "g"), true ), FI: new IbanSpecification( "FI", 'Finland', 18, "3!n11!n", 14, "FI2!n3!n11!n", new RegExp( "^(?FI)" + "(?[0-9]{2})" + "(?" + "(?[0-9]{3})" + "([0-9]{11})" + ")$", "g"), true // FIXME: Includes AX ), FK: new IbanSpecification( "FK", 'Falkland Islands', 18, "2!a12!n", 14, "FK2!n2!a12!n", new RegExp( "^(?FK)" + "(?[0-9]{2})" + "(?" + "(?[A-Z]{1})" + "([0-9]{12})" + ")$", "g"), false ), FO: new IbanSpecification( "FO", 'Faroe Islands', 18, "FO2!n4!n9!n1!n", 14, "4!n9!n1!n", new RegExp( "^(?FO)" + "(?[0-9]{2})" + "(?" + "(?[0-9]{4})" + "([0-9]{9})" + "([0-9])" + ")$", "g"), false ), FR: new IbanSpecification( "FR", 'France', 27, "FR2!n5!n5!n11!c2!n", 23, "5!n5!n11!c2!n", new RegExp( "^(?FR)" + "(?[0-9]{2})" + "(?" + "(?[0-9]{5})" + "([0-9]{5})" + "([0-9a-zA-Z]{11})" + "([0-9]{2})" + ")$", "g"), true // FIXME: Includes a ton of extra countries ), GB: new IbanSpecification( "GB", 'United Kingdom', 22, "GB2!n4!a6!n8!n", 18, "4!a6!n8!n", new RegExp( "^(?GB)" + "(?[0-9]{2})" + "(?" + "(?[A-Z]{4})" + "(?[0-9]{6})" + "([0-9]{8})" + ")$", "g"), true // FIXME: Includes extra countries ), GE: new IbanSpecification( "GE", 'Georgia', 22, "U02F16", new RegExp("^GE[0-9]{2}([A-Z]{2})([0-9]{16})$", "g") ), GI: new IbanSpecification( "GI", 'Gibraltar', 23, "U04A15", new RegExp("^GI[0-9]{2}([A-Z]{4})([0-9a-zA-Z]{15})$", "g") ), GL: new IbanSpecification( "GL", 'Greenland', 18, "F04F09F01", new RegExp("^GL[0-9]{2}([0-9]{4})([0-9]{9})([0-9])$", "g") ), GR: new IbanSpecification( "GR", 'Greece', 27, "F03F04A16", new RegExp("^GR[0-9]{2}([0-9]{3})([0-9]{4})([0-9a-zA-Z]{16})$", "g") ), GT: new IbanSpecification( "GT", 'Guatemala', 28, "A04A20", new RegExp("^GT[0-9]{2}([0-9a-zA-Z]{4})([0-9a-zA-Z]{20})$", "g") ), HR: new IbanSpecification( "HR", 'Croatia', 21, "F07F10", new RegExp("^HR[0-9]{2}([0-9]{7})([0-9]{10})$", "g") ), HU: new IbanSpecification( "HU", 'Hungary', 28, "F03F04F01F15F01", new RegExp("^HU[0-9]{2}([0-9]{3})([0-9]{4})([0-9])([0-9]{15})([0-9])$", "g") ), IE: new IbanSpecification( "IE", 'Ireland', 22, "U04F06F08", new RegExp("^IE[0-9]{2}([A-Z]{7})([0-9]{6})([0-9]{8})$", "g") ), IL: new IbanSpecification( "IL", 'Israel', 23, "F03F03F13", new RegExp("^IL[0-9]{2}([0-9]{3})([0-9]{3})([0-9]{13})$", "g") ), //IQ: new IbanSpecification("IQ", 'Iraq', 23), IS: new IbanSpecification( "IS", 'Iceland', 26, "F04F02F06F10", new RegExp("^IS[0-9]{2}([0-9]{4})([0-9]{2})([0-9]{6})([0-9]{10})$", "g") ), IT: new IbanSpecification( "IT", 'Italy', 27, "U01F05F05A12", new RegExp("^IT[0-9]{2}([A-Z])([0-9]{5})([0-9]{5})([0-9a-zA-Z]{12})$", "g") ), JO: new IbanSpecification( "JO", 'Jordan', 30, "U04F04A18", new RegExp("^JO[0-9]{2}([A-Z]{4})([0-9]{4})([0-9a-zA-Z]{18})$", "g") ), KW: new IbanSpecification( "KW", 'Kuwait', 30, "U04A22", new RegExp("^KW[0-9]{2}([A-Z]{4})([0-9a-zA-Z]{22})$", "g") ), KZ: new IbanSpecification( "KZ", 'Kazakhstan', 20, "F03A13", new RegExp("^KZ[0-9]{2}([0-9]{3})([0-9a-zA-Z]{13})$", "g") ), LB: new IbanSpecification( "LB", 'Lebanon', 28, "F04A20", new RegExp("^LB[0-9]{2}([0-9]{4})([0-9a-zA-Z]{20})$", "g") ), LC: new IbanSpecification( "LC", 'Saint Lucia', 32, "U04A24", new RegExp("^LC[0-9]{2}([A-Z]{4})([0-9a-zA-Z]{24})$", "g") ), LI: new IbanSpecification( "LI", 'Liechtenstein', 21, "F05A12", new RegExp("^LI[0-9]{2}([0-9]{5})([0-9a-zA-Z]{12})$", "g") ), LT: new IbanSpecification( "LT", 'Lithuania', 20, "F05F11", new RegExp("^LT[0-9]{2}([0-9]{5})([0-9]{11})$", "g") ), LU: new IbanSpecification( "LU", 'Luxembourg', 20, "F03A13", new RegExp("^LU[0-9]{2}([0-9]{3})([0-9a-zA-Z]{13})$", "g") ), LV: new IbanSpecification( "LV", 'Latvia', 21, "U04A13", new RegExp("^LV[0-9]{2}([A-Z]{4})([0-9a-zA-Z]{13})$", "g") ), //LY: new IbanSpecification("LY", 'Libya', 25), MC: new IbanSpecification( "MC", 'Monaco', 27, "F05F05A11F02", new RegExp("^MC[0-9]{2}([0-9]{5})([0-9]{5})([0-9a-zA-Z]{11})([0-9]{2})$", "g") ), MD: new IbanSpecification( "MD", 'Moldova', 24, "A02A18", new RegExp("^MD[0-9]{2}([0-9a-zA-Z]{2})([0-9a-zA-Z]{18})$", "g") ), ME: new IbanSpecification( "ME", 'Montenegro', 22, "F03F13F02", new RegExp("^ME[0-9]{2}([0-9]{3})([0-9]{13})([0-9]{2})$", "g") ), MK: new IbanSpecification( "MK", 'North Macedonia', 19, "F03A10F02", new RegExp("^MK[0-9]{2}([0-9]{3})([0-9a-zA-Z]{10})([0-9]{2})$", "g") ), MR: new IbanSpecification( "MR", 'Mauritania', 27, "F05F05F11F02", new RegExp("^MR[0-9]{2}([0-9]{5})([0-9]{5})([0-9]{11})([0-9]{2})$", "g") ), MT: new IbanSpecification( "MT", 'Malta', 31, "U04F05A18", new RegExp("^MT[0-9]{2}([A-Z]{4})([0-9]{5})([0-9a-zA-Z]{18})$", "g") ), MU: new IbanSpecification( "MU", 'Mauritius', 30, "U04F02F02F12F03U03", new RegExp("^MU[0-9]{2}([A-Z]{4})([0-9]{2})([0-9]{2})([0-9]{12})([0-9]{3})([A-Z]{3})$", "g") ), NL: new IbanSpecification( "NL", 'Netherlands', 18, "U04F10", new RegExp("^NL[0-9]{2}([A-Z]{4})([0-9]{10})$", "g") ), NO: new IbanSpecification( "NO", 'Norway', 15, "F04F06F01", new RegExp("^NO[0-9]{2}([0-9]{4})([0-9]{6})([0-9])$", "g") ), PK: new IbanSpecification( "PK", 'Pakistan', 24, "U04A16", new RegExp("^PK[0-9]{2}([A-Z]{4})([0-9a-zA-Z]{16})$", "g") ), PL: new IbanSpecification( "PL", 'Poland', 28, "F08F16", new RegExp("^PL[0-9]{2}([0-9]{8})([0-9]{16})$", "g") ), PS: new IbanSpecification( "PS", 'Palestine', 29, "U04A21", new RegExp("^PS\"[0-9]{2}([A-Z]{4})([0-9a-zA-Z]{21})$", "g") ), PT: new IbanSpecification( "PT", 'Portugal', 25, "F04F04F11F02", new RegExp("^PT[0-9]{2}([0-9]{4})([0-9]{4})([0-9]{11})([0-9]{2})$", "g") ), QA: new IbanSpecification( "QA", 'Qatar', 29, "U04A21", new RegExp("^QA[0-9]{2}([A-Z]{4})([0-9a-zA-Z]{21})$", "g") ), RO: new IbanSpecification( "RO", 'Romania', 24, "U04A16", new RegExp("^RO[0-9]{2}([A-Z]{4})([0-9a-zA-Z]{16})$", "g") ), RS: new IbanSpecification( "RS", 'Serbia', 22, "F03F13F02", new RegExp("^RS[0-9]{2}([0-9]{3})([0-9]{13})([0-9]{2})$", "g") ), SA: new IbanSpecification( "SA", 'Saudi Arabia', 24, "F02A18", new RegExp("^SA[0-9]{2}([0-9]{2})([0-9a-zA-Z]{18})$", "g") ), SC: new IbanSpecification( "SC", 'Seychelles', 31, "U04F02F02F16U03", new RegExp("^SC[0-9]{2}([A-Z]{4})([0-9]{2})([0-9]{2})([0-9]{16})([A-Z]{3})$", "g") ), //SD: new IbanSpecification("SD", 'Sudan', 18), SE: new IbanSpecification( "SE", 'Sweden', 24, "F03F16F01", new RegExp("^SE[0-9]{2}([0-9]{3})([0-9]{16})([0-9])$", "g") ), SI: new IbanSpecification( "SI", 'Slovenia', 19, "F05F08F02", new RegExp("^SI[0-9]{2}([0-9]{5})([0-9]{8})([0-9]{2})$", "g") ), SK: new IbanSpecification( "SK", 'Slovakia', 24, "F04F06F10", new RegExp("^SK[0-9]{2}([0-9]{4})([0-9]{6})([0-9]{10})$", "g") ), SM: new IbanSpecification( "SM", 'San Marino', 27, "U01F05F05A12", new RegExp("^SM[0-9]{2}([A-Z])([0-9]{5})([0-9]{5})([0-9a-zA-Z]{12})$", "g") ), //SO: new IbanSpecification("SO", 'Somalia', 23), ST: new IbanSpecification( "ST", 'São Tomé and Príncipe', 25, "F08F11F02", new RegExp("^ST[0-9]{2}([0-9]{8})([0-9]{11})([0-9]{2})$", "g") ), //SV: new IbanSpecification("SV", 'El Salvador', 28), TL: new IbanSpecification( "TL", 'Timor-Leste', 23, "F03F14F02", new RegExp("^TL[0-9]{2}([0-9]{3})([0-9]{14})([0-9]{2})$", "g") ), TN: new IbanSpecification( "TN", 'Tunisia', 24, "F02F03F13F02", new RegExp("^TN[0-9]{2}([0-9]{2})([0-9]{3})([0-9]{13})([0-9]{2})$", "g") ), TR: new IbanSpecification( "TR", 'Turkey', 26, "F05A01A16", new RegExp("^TR[0-9]{2}([0-9]{5})([0-9a-zA-Z])([0-9a-zA-Z]{16})$", "g") ), UA: new IbanSpecification( "UA", 'Ukraine', 29, "F06A19", new RegExp("^UA[0-9]{2}([0-9]{6})([0-9a-zA-Z]{19})$", "g") ), VA: new IbanSpecification( "VA", 'Vatican City State\n', 22, "VA2!n3!n15!n", 18, "3!n15!n", new RegExp( "^(?VA)" + "(?[0-9]{2})" + "(?" + "(?[A-Z]{3})" + "([0-9]{15})" + ")$", "g"), false // FIXME: Has empty data for SEPA !!! ), VG: new IbanSpecification( "VG", 'Virgin Islands', 24, "VG2!n4!a16!n", 20, "4!a16!n", new RegExp( "^(?VG)" + "(?[0-9]{2})" + "(?" + "(?[A-Z]{4})" + "([0-9]{16})" + ")$", "g"), false ), XK: new IbanSpecification( "XK", 'Kosovo', 20, "XK2!n4!n10!n2!n", 16, "4!n10!n2!n", new RegExp( "^(?XK)" + "(?[0-9]{2})" + "(?" + "(?[0-9]{2})" + "(?[0-9]{2})" + "([0-9]{10})" + "([0-9]{2})" + ")$", "g"), false ), YE: new IbanSpecification( "YE", 'Yemen', 30, "YE2!n4!a4!n18!c", 26, "4!a4!n18!c", new RegExp( "^(?YE)" + "(?[0-9]{2})" + "(?" + "(?[A-Z]{4})" + "(?[0-9]{4})" + "([0-9a-zA-Z]{18})" + ")$", "g"), false ), }; console.log(countriesIbanSpecs);