File size: 1,855 Bytes
9438a57 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | /**
* Türkiye IBAN doğrulayıcı: uzunluk (26), ülke kodu, ayrılmış hane ve ISO 13616 mod-97 kontrolü.
* Biçim: TR + 2 kontrol hanesi + 5 hane banka kodu + 1 ayrılmış hane ('0') + 16 hane hesap numarası.
*/
public class IbanValidator {
public static String normalize(String iban) {
if (iban == null) {
throw new IllegalArgumentException("IBAN boş olamaz");
}
return iban.replace(" ", "").toUpperCase();
}
public static boolean isValid(String iban) {
String s = normalize(iban);
if (s.length() != 26 || !s.startsWith("TR")) {
return false;
}
if (s.charAt(9) != '0') {
return false;
}
for (int i = 2; i < s.length(); i++) {
if (!Character.isDigit(s.charAt(i))) {
return false;
}
}
return mod97(s.substring(4) + s.substring(0, 4)) == 1;
}
static int mod97(String s) {
int r = 0;
for (char c : s.toCharArray()) {
int v = Character.isLetter(c) ? c - 'A' + 10 : c - '0';
r = v >= 10 ? (r * 100 + v) % 97 : (r * 10 + v) % 97;
}
return r;
}
public static String bankCode(String iban) {
String s = normalize(iban);
if (!isValid(s)) {
throw new IllegalArgumentException("Geçersiz IBAN: " + iban);
}
return s.substring(4, 9);
}
/** Dörder karakterlik gruplar hâlinde yazar: "TR33 0006 1005 ...". */
public static String format(String iban) {
String s = normalize(iban);
StringBuilder b = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (i > 0 && i % 4 == 0) {
b.append(' ');
}
b.append(s.charAt(i));
}
return b.toString();
}
}
|