SevdanurGenc's picture
Upload 300 files
9438a57 verified
Raw History Blame Contribute Delete
1.86 kB
/**
* 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();
}
}