48 lines
1.6 KiB
Java
48 lines
1.6 KiB
Java
import java.math.BigInteger;
|
|
import java.util.*;
|
|
|
|
public class IBAN {
|
|
static final Map<String, Integer> isoPairs;
|
|
|
|
static final String iso = "AL28 AD24 AT20 AZ28 BE16 BH22 BA20 BR29 BG22 "
|
|
+ "HR21 CY28 CZ24 DK18 DO28 EE20 FO18 FI18 FR27 GE22 DE22 GI23 "
|
|
+ "GL18 GT28 HU28 IS26 IE22 IL23 IT27 KZ20 KW30 LV21 LB28 LI21 "
|
|
+ "LT20 LU20 MK19 MT31 MR27 MU30 MC27 MD24 ME22 NL18 NO15 PK24 "
|
|
+ "PS29 PL28 PT25 RO24 SM27 SA24 RS22 SK24 SI19 ES24 SE24 CH21 "
|
|
+ "TN24 TR26 AE23 GB22 VG24 GR27 CR21";
|
|
|
|
static {
|
|
isoPairs = new HashMap<>();
|
|
for (String p : iso.split(" "))
|
|
isoPairs.put(p.substring(0, 2), Integer.parseInt(p.substring(2)));
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
for (String iban : new String[]{"GB82 WEST 1234 5698 7654 32",
|
|
"GB82 TEST 1234 5698 7654 32",
|
|
"GB81 WEST 1234 5698 7654 32",
|
|
"SA03 8000 0000 6080 1016 7519",
|
|
"CH93 0076 2011 6238 5295 7"})
|
|
System.out.printf("%s is valid: %s%n%n", iban, validateIBAN(iban));
|
|
}
|
|
|
|
static boolean validateIBAN(String iban) {
|
|
iban = iban.replaceAll("\\s", "").toUpperCase();
|
|
|
|
int len = iban.length();
|
|
|
|
if (len < 4 || isoPairs.get(iban.substring(0, 2)) != len)
|
|
return false;
|
|
|
|
iban = iban.substring(4) + iban.substring(0, 4);
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
for (int i = 0; i < len; i++)
|
|
sb.append(Character.digit(iban.charAt(i), 36));
|
|
|
|
BigInteger bigInt = new BigInteger(sb.toString());
|
|
|
|
return bigInt.mod(new BigInteger("97")).intValue() == 1;
|
|
}
|
|
}
|