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