Merhabalar, C# Kredi Kartı Doğrulama – Luhn Algoritması dersi ile C# Eğitim Setime devam ediyorum. Bu dersimizde Luhn algoritmasını kullanarak Kredi Kartı numarasının geçerli bir numara olup olmadığının kontrolünü yapacağız.
C# Kredi Kartı Doğrulama – Luhn Algoritması
Luhn Algoritması Nedir?
Luhn Algoritması‘nın temeli 1950’lere kadar dayanmaktadır. Hans Peter Luhn ve IBM ortak çalışmaları ile 1954 yılında geliştirilen bu algoritma aynı zamanda Luhn Check yada Mod10 Check olarak da bilinmektedir.
Luhn algoritmasına göre hesaplama şu şekildedir;
- Kart numarası 16 karakter olmalıdır
- Karakterlerin hepsi sayı olmalıdır.
- Çift hanelerde yer alan rakamların hepsi toplanır.
- Tek hanelerde yer alan rakamlar önce iki ile çarpılır. Çarpımın sonucu 10’dan büyük ise sayının basamakları toplanır. Tüm sonuçlar toplanır.
- İki toplam sonucu birbirleri ile tekrar toplanır. Bu toplamın MOD10’u 0 ise yani 10 tam olarak bölünüyor ise bu kredi kart numarası geçerli bir numaradır..
Aşağıda, internette araştırma yaparken bulduğum bir resmi sizlerle paylaşıyorum. Bu görseli inceleyerek yukarıdaki adımları daha net algılayabilirsiniz. Bu görselde hatalı bir kart numarası üzerinde yapılan işlemler görülmektedir.
Şimdi kodlarımızı yazmaya geçelim.
C# Luhn Algoritması
Şartları kontrol ettiğimizde bize gerekli olan kontroller;
- Girilen kart numarası 16 karakter olmalı
- Girilen tüm karakterler rakam olmalı
Öncelikle girilen kart numarasını özel karakterlerden temizleyen bir metot yazacağız. İkinci olarak yukarıda verdiğim 2 maddeyi kontrol edecek metotları yazacağız. Son olarak da bir sayının basamaklarını toplama işlemini yapacak bir metot yazacağız. Bu işlemleri metotlara ayırmamızın sebebi hem bu metotları başka işlemler için de kullanılabilir kılmak hem de kodları daha anlaşılır kılmak içindir. Aksi takdirde kodlar çok karışık görünecektir.
Kart no temizleme
string KartNoTemizle(string text) { text = text.Replace("-", "").Replace(" ", "").Replace("(", "").Replace(")", "").Replace("_", ""); return text; }
Ben burada tre (“-“), boşluk (” “), parantezler ( “(” , “)” ) ve alt tre ( “-” ) karakterlerinin ayraçlar olarak kullanılabilir karakterler olarak gördüğümden en başta temizlemek istedim. Yoksa sorun değil var ise temizlenecekler.
Ana kontrolü yapan metodumuzda kullanacağız.
Kart no uzunluk kontrolü
bool KartNoUzunlukKontrol(string kartno) { if (kartno.Length == 16) return true; else return false; }
Burada, girilen (temizlendikten sonra) kart numarasının karakter sınırına uyup uymadığını kontrol ediyoruz.
Sayısal değer kontrolü
bool SayisalDegerKontrol(string deger) { foreach (char chr in deger) { if (!Char.IsNumber(chr)) return false; } return true; }
Burada girilen (temizlendikten sonra) kart numarasındaki karakterlerin sayısal değer olup olmadığını kontrol ediyoruz.
Sayının basamaklarını toplama
int SayiBasamaklariTopla(int sayi) { int toplam = 0; while (sayi > 0) { toplam += sayi % 10; sayi /= 10; } return toplam; }
Sayının basamaklarını toplayan metodumuz.
Bize gerekli olan tüm metotları verdikten sonra yukarıdaki kontrolleri yapacak olan ana metodumuzu verelim.
BİLGİ: Yukarıdaki metotları ayrı ayrı vermiş olmamızın en büyük faydası, örneğin sayısal değer kontrolünü başka bir yerde de kullanabiliriz. Ya da sayının basamaklarını toplama metodunu başka bir işlem için de kullanabiliriz. Metotlara dikkat ederseniz, her metodun aldığı parametrenin ismini kendi işlemine göre yazdım. Bu da benim bu metotları başka yerlerde de kullanabileceğimin bir ifadesi olarak görülebilir.
Lunh Algoritması
bool Kredi_Kart_Lunh_Algoritmasi(string kartno) { kartno = KartNoTemizle(kartno); // kart numarasını temizledik. if (KartNoUzunlukKontrol(kartno) == false) // uzunluğu kontrol ettik return false; else if (SayisalDegerKontrol(kartno) == false) // sayısal değerleri kontrol ettik return false; else { int ciftlerin_toplami = 0; int teklerin_toplami = 0; for (int i = 0; i < kartno.Length; i++) { int eleman = Convert.ToInt32(kartno[i].ToString()); if (i % 2 == 0) ciftlerin_toplami += SayiBasamaklariTopla(eleman * 2); else teklerin_toplami += eleman; } int sonuc = (teklerin_toplami + ciftlerin_toplami) % 10; if (sonuc == 0) return true; else return false; } }
Yukarıdaki metodumuz şartları kontrol eden ve hesaplamaları yapan metodumuzdur.
- İlk olarak girilen kart numarasını temizledik.
- Temizlenen kart numarasının karakter sayısını kontrol ettik.
- Temizlenen kart numarasının sadece sayısal değerler içerdiğinden emin olduk.
- Hesaplamaları yaptıktan sonra sonucu hesapladık.
- Toplamların MOD10’u sıfır ise kart numarası geçerli 0 değil ise geçersizdir anlamında true ve false gönderdik.
Tüm kontrollerimizi yaptık. Ben burada şartlara göre geri dönüş yapmadım. Örneğin karakter sayısı tutmadı ise, “Karakter sayısı geçersiz” ya da sayısal olmayan değer içeriyor ise “Sayısal olmayan karakterler var” gibi uyarı mesajları çıkarmadım.
Şimdi Kontrol Et butonumuzun click eventine aşağıdaki kodları yazalım.
private void btn_kontrol_Click(object sender, EventArgs e) { if (Kredi_Kart_Lunh_Algoritmasi(txt_card_no.Text) == true) lbl_sonuc.Text = "Kart No Geçerli"; else lbl_sonuc.Text = "Kart No Geçersiz"; }
Burada ana metodumuzu kullandık. Ana metodumuzdan, herhangi bir şarta uyulmadığı takdirde “False” değeri döneceğinden “Kart No Geçersiz” mesajını alacağız. Sadece tüm şartlara uyulduğu takdirde “True” sonucu döneceğinden bir şüphemiz olmayacak.
Ben kendi kredi kartım ile denediğimde “Kart No Geçerli” mesajını aldım. Sizlerde deneyip görebilirsiniz.
C# Kredi Kartı Doğrulama – Luhn Algoritması, yazımda bu kadardı arkadaşlar. Diğer yazılarımızda görüşmek üzere…
C Sharp Eğitim Seti eğitimi sayfasına gitmek için tıklayınız.
Derslerime özel olarak hazırladığım Github Projeme bağlantıya tıklayarak ulaşabilirsiniz… Bu dersimde Github projemde yerini almıştır.
Sağlıcakla ve takipte kalın.
Kart temizliğini regex replace ile yapsan daha iyi olur ve kod fazlalığı yok olur.
Regex.Replace(Price.ToString(), “[^0-9]”, “”)
Güzel anlatım olmuş.
Merhaba,
Bu şekilde kullanımı ilk defa görüyorum. Bu harika katkı için çok teşekkürler. Bende bu yöntemi öğrenmiş oldum.
Yorum için teşekkürler.