Skip to content

Instantly share code, notes, and snippets.

@jferrao
Created March 31, 2018 08:41
Show Gist options
  • Save jferrao/484cdc7ec6fe108902d146449c1656d8 to your computer and use it in GitHub Desktop.
Save jferrao/484cdc7ec6fe108902d146449c1656d8 to your computer and use it in GitHub Desktop.
IBAN validator
import java.math.BigInteger
class Iban(private val iban: String) {
companion object {
/* List updated to release 73, January 2017, of IBAN Registry (75 countries) */
private const val countryCodes =
"AD24 AE23 AL28 AT20 AZ28 BA20 BE16 BG22 BH22 BR29 BY28 CH21 CR22 CY28 CZ24 DE22 " +
"DK18 DO28 EE20 ES24 FI18 FO18 FR27 GB22 GE22 GI23 GL18 GR27 GT28 HR21 HU28 IE22 " +
"IL23 IQ23 IS26 IT27 JO30 KW30 KZ20 LB28 LC32 LI21 LT20 LU20 LV21 MC27 MD24 ME22 " +
"MK19 MR27 MT31 MU30 NL18 NO15 PK24 PL28 PS29 PT25 QA29 RO24 RS22 SA24 SC31 SE24 " +
"SI19 SK24 SM27 ST25 SV28 TL23 TN24 TR26 UA29 VG24 XK20"
}
fun isValid(): Boolean {
// remove spaces from IBAN
var s = iban.replace("\\s+".toRegex(), "")
// check country code
if (!countryCodes.contains(s.substring(0, 2) + s.length)) return false
// move first 4 characters to end
s = s.substring(4) + s.substring(0, 4)
// replace A to Z with numbers 10 To 35
for (ch in 'A'..'Z') s = s.replace(ch.toString(), (ch - 55).toInt().toString())
// check whether mod 97 calculation gives a remainder of 1
return BigInteger(s) % BigInteger.valueOf(97L) == BigInteger.ONE
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment