IBAN Kontol Fonksiyonu (Offline IBAN Validator)

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

IBAN Kontol Fonksiyonu (Offline IBAN Validator)

Mesaj gönderen mrmarman »

Uluslararası Banka Hesap Numarası ( IBAN = International Bank Account Number )

- Tutarlılık kontrolü için fonksiyondur. Projelerinizde hesap numarası kaydı yapılırken, en azından doğru girilip girilmediğini kontrol edebilirsiniz.
- Offline bir kontroldür. Aritmetiksel sonuç TRUE veya FALSE döner.
- Aralarda boşluklar olabilir, fonksiyon içerisinden bu boşluklar değerlendirmeye alınmayacak şekilde elenirler.

Referans için bkz. WiKi
Wikipedia, the free encyclopedia yazdı:Algorithms
Validating the IBAN
An IBAN is validated by converting it into an integer and performing a basic mod-97 operation (as described in ISO 7064) on it. If the IBAN is valid, the remainder equals 1.[Note 1] The algorithm of IBAN validation is as follows:[8]

Check that the total IBAN length is correct as per the country. If not, the IBAN is invalid
Move the four initial characters to the end of the string
Replace each letter in the string with two digits, thereby expanding the string, where A = 10, B = 11, ..., Z = 35
Interpret the string as a decimal integer and compute the remainder of that number on division by 97
If the remainder is 1, the check digit test is passed and the IBAN might be valid.

Example (fictitious United Kingdom bank, sort code 12-34-56, account number 98765432):

• IBAN: GB82 WEST 1234 5698 7654 32
• Rearrange: W E S T12345698765432 G B82
• Convert to integer: 3214282912345698765432161182
• Compute remainder: 3214282912345698765432161182 mod 97 = 1
Kullanımı

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  if CheckIBAN( 'GB29 NWBK 6016 1331 9268 19' )
    then MessageDlg('IBAN OK', mtInformation, [mbOk], 0 )
    else MessageDlg('IBAN Hatalıdır...', mtError, [mbOk], 0 );
end;
Fonksiyon

Kod: Tümünü seç

// IBAN = International Bank Account Number
function CheckIBAN(iban: string): Boolean;
var
  iSayac,
  jSayac,
  Sonuc     : Integer;
  strIcerik : string;
  iSayi     : Longint;
  cHarf     : Char;
begin
  Sonuc := 0;
  // küçük harfler varsa büyük harfe çevir...
  iban := UpperCase( StringReplace(iban, ' ', '', [rfReplaceAll]) );
  // ilk 4 karakteri en sona taşı...
  iban := iban + Copy(iban, 1, 4);
  System.Delete(iban, 1, 4);
  // alfanümerik karakterleri, kendi ASCII değerlerinden
  // 55 sayısını çıkartarak hallerinin sayısal haliyle değiştir.
  for cHarf := 'A' to 'Z'
    do iban := StringReplace(iban, cHarf, IntToStr(Ord(cHarf) - 55), [rfReplaceAll]);

  iSayac    := 1;
  jSayac    := 9;
  strIcerik := '';
  try
    while iSayac <= Length(iban) do
    begin
      if jSayac  > Length(iban) then
         jSayac := Length(iban);

      strIcerik := strIcerik + Copy(iban, iSayac, jSayac);
      iSayi     := StrToInt(strIcerik);
      Sonuc     := iSayi mod 97;

      iSayac    := iSayac + jSayac;
      strIcerik := IntToStr(Sonuc);
      jSayac    := 9 - Length(strIcerik);
    end;
  except
    Sonuc := 0;
  end;
  Result := Sonuc = 1;
end;
Resim
Resim ....Resim
ismailkocacan
Üye
Mesajlar: 88
Kayıt: 25 Eyl 2011 06:11
Konum: İstanbul
İletişim:

Re: IBAN Kontol Fonksiyonu (Offline IBAN Validator)

Mesaj gönderen ismailkocacan »

Daha önce http://delphiturkiye.com/forum/viewtopi ... 19&t=29891 bir konu açmıştım.
Daha başka nasıl yapabilirim diyenler bakabilir.
Reqular Expressions ile de pratik bir şekilde yapılabilinir.
http://www.catswhocode.com/blog/10-regu ... evelopment şurada "Validate an IBAN" başlığı altında bir pattern var.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: IBAN Kontol Fonksiyonu (Offline IBAN Validator)

Mesaj gönderen mrmarman »

@ismailkocacan

- Burada benim anlamadığım ya da sizin yanlış anladığınız bir husus var.

- Burada paylaştığım kod artimetiksel bir bütünlük sorgulıyor. Sizin bahsettiğiniz ise format olarak karakter kuralı oluşturmak şeklinde. Ya da ben yanlış anlıyorum. Öyle ise düzeltin.

- Örnek olsun diye bize IBAN ve TCKimlik No kodlamasını doğrulayan bir örnek kod yazabilir misiniz ?
- Böylece validation için nasıl bir formül uyguladığını burada paylaşmı olursunuz, böylece farkı daha açık ifade edebilirim.
- Şöyle ki, rakamlardan herhangi birisi (+) veya (-) yönde değiştiği anda formül gereği validation bozuluyor olması gereklidir. Bahsettiğiniz sistemde böyle bir kontrol göremedim.
Resim
Resim ....Resim
ismailkocacan
Üye
Mesajlar: 88
Kayıt: 25 Eyl 2011 06:11
Konum: İstanbul
İletişim:

Re: IBAN Kontol Fonksiyonu (Offline IBAN Validator)

Mesaj gönderen ismailkocacan »

Merhaba hocam.

Muhakkak yanlış anladığım/gözden kaçırdığım kısımlar vardır. :)
Öncelikle mesajınızı gördükten sonra,bu işin regular expression ile de yapılabilinir diye düşündüm.
Ama herhangi bir deneme yapmamıştım.

TCKimlik No doğrulama kodlaması ile ilgili deneme yapmadım.
IBAN kontrolü ile ilgili bir test projesi oluşturdum.
Eksik veya yanlış çalışıyorsa,regex ile yapılamadığını öğrenmiş oluruz :)

Exe ile test etmek isteyenler : http://www.dosya.tc/server32/BrkJtg/Project1.rar.html
saygılarımla.
Dosya ekleri
TestRegex.rar
Test Regex (Delphi 2010)
(173.55 KiB) 232 kere indirildi
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: IBAN Kontol Fonksiyonu (Offline IBAN Validator)

Mesaj gönderen SimaWB »

Sn. @smailkocacan; maalesef yanlış anladığınız bir durum var ve Sn. @mrmarman'ın bahsettiği konu doğru.

Regex ile sadece syntax kontrolü yaparsınız. Yani girilen değerin sizin koşullarınıza uygun girilip girilmediğini kontrol edersiniz. Ama IBAN numaraları belirli bir ISO standandardı vardır ki mrmarman bunun linkini paylaşmış.
mrmarman'ın paylaştığı kod gerçekten böyle bir IBAN olup olamayacağını kontrol eder. Yani yazım kuralları doğru olabilir ama standarda uymuyorsa gerçekte öyle bir IBAN yok demektir.

Mesela sizin verdiğiniz örnekten gidelim:
TR64 0006 2001 0880 0006 6899 42 bu IBAN geçerlidir ama TR64 0006 2001 0880 0016 6899 42 geçersizdir. Çünkü IBANın standartlarına uygun değil.
There's no place like 127.0.0.1
ismailkocacan
Üye
Mesajlar: 88
Kayıt: 25 Eyl 2011 06:11
Konum: İstanbul
İletişim:

Re: IBAN Kontol Fonksiyonu (Offline IBAN Validator)

Mesaj gönderen ismailkocacan »

Haklısınız
java tarafında https://github.com/arturmkrtchyan/iban4j şu örneğe baktım şimdi.Onda da regex kullanılmamış.

Sanıyorum http://www.catswhocode.com/blog/10-regu ... evelopment şurada ki regexi yazan vatandaş iban girişi esnasında formata uygunluğunu kontrol için yazmış.

En azından aradaki farkı öğrenmiş oldum.
cevaplar için teşekkürler...
Cevapla