/** * 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(); } }