Created
March 31, 2018 08:41
-
-
Save jferrao/484cdc7ec6fe108902d146449c1656d8 to your computer and use it in GitHub Desktop.
IBAN validator
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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