Giriş
Şu zamana kadar TC Kimlik numarasını Javascript ile validate ederken kontrol ettiğim tek şey, 11 haneli olup olmamasıydı. Daha sonra, kullanıcıların sallamasyon bir numara ile (22222222222 gibi) formları es geçmelerini içime sindiremediğimden (Hoş; front-end dünyasında, kullanıcı tarayıcısında yaptığımız her şey manipüle edilebiliyor ya, neyse) TC kimlik numarasının algoritmasını biraz araştırdım.
Tıpkı kimlik sahteciliği konusunda (Bandrolün ucu tam Seri No'nun ucuna denk geliyormuş) bazı önlemler alındığı gibi, TC Kimlik numarasının da kendi içinde bir algoritması varmış.
- 11 hanelidir.
- Tamamen rakamlardan oluşuyor.
- Sıfır (0) ile başlamıyor.
- 1, 2, 3, 4, 5, 6, 7, 8, 9 ve 10. basamaktaki rakamların toplamından elde ettiğimiz sonucu 10'a böldüğümüzde (Yani mod 10), çıkan sonuç 11. basamaktaki rakama eşit çıkıyor.
- 1, 3, 5, 7, ve 9. basamaktaki sayıların toplamını 7 ile çarpıp; 2, 4, 6 ve 8. basamaktaki sayıların toplamını çıkardığımızda, çıkan sonucun 10'a bölümünden kalanı (Yani % 10) 10. basamakataki sayıya eşit çıkıyor.
Şimdi bu kurallara uygun olarak validate fonksiyonunu yazalım.
Fonksiyonu oluşturma
Bağımsız olarak çalıştıracağım bir fonksiyon oluştururken isimlendirme aşamasında her zaman aksiyonu tanımlayan kelime ile başlıyorum.
Örneğin
setValue
gibi. Ya dagetParams
. Ne bileyim.initGoogleMaps
,bindBilmemHangiPlugin
gibi.Tek bir objeye ait birden çok fonksiyon yazdığımda ise, obje odaklı isimlendiriyorum.
Örneğin
modalOpen
,modalClose
vemodalAlert
gibi.Böylece Sublime Text ile (Artık tüm Arayüz geliştiricilerinin Sublime boyunduruğu altına girmesi gerekiyor.) bir objeye ait fonksiyonlar silsilesini çağırmak istediğimde,
modal
yazıpctrl + space
yaptığımda bana modal ile başlayan değişkenleri sıralıyor. Proje büyüyüp de yazdığınız değişkenler artmaya başladığında, verdiğiniz isimleri hatırlamaya çalışmayarak bir kaç yüz bin milyor beyin hücrenizi kurtarabilirsiniz.
Fonksiyonu oluşturalım. value
burada, fonksiyona gönderdiğimiz input değeri oluyor.
var checkTcNum = function(value) { };
TC Kimlik numarasını parçalara ayırabilmek için, value değerini string tipine çeviriyoruz.
Javascript'in substr
fonksiyonu, sadece string değerlerini parçalayabiliyor.
Hoş, input value'sunu aldığınızda da değer tipi string oluyor ama, ben ne olur ne olmaz diye; belki tc kimlik numarasını integer tipinde oluşturup fonksiyona gönderdiğinizi varsayarak ( var tcId = 23537329792;
gibi ) string'e çeviriyorum.
value = value.toString();
Fonksiyona gönderilen değeri Regex ile sadece rakamlardan oluşup oluşmadığını ve 11 haneli olup olmadığını kontrol ediyoruz.
is
ile başlayan bütün değişkenlerimin değeri ya da fonksiyonlarımın dönüşü, Boolean tipindededir.
var isEleven = /^[0-9]{11}$/.test(value);
For döngüsü ile 10. basamağa kadar olan sayıları, döngüden önce oluşturduğumuz totalX
değişkenine ekliyoruz.
isRuleX
değişkenine ise, topladığımız sayıların 10'a bölümünden kalanının 11. haneye eşit olup olmadığını atıyoruz.
var totalX = 0; for (var i = 0; i < 10; i++) { totalX += Number(value.substr(i, 1)); } var isRuleX = totalX % 10 === value.substr(10,1);
1, 3, 5, 7, ve 9. hanelerdeki sayıları toplayacağımız değişkeni ve 2, 4, 6, ve 8. hanelerdeki sayıların toplamını atayacağımız değişkeni tanımlıyoruz.
var totalY1 = 0; var totalY2 = 0;
Tekil hanelerdeki sayıları toplayan for döngüsü:
for (var i = 0; i < 10; i+=2) { totalY1 += Number(value.substr(i, 1)); }
Çift hanelerdeki sayıları toplayan for döngüsü:
for (var i = 1; i < 10; i+=2) { totalY2 += Number(value.substr(i, 1)); }
Son aşama olarak çıkan sonucu 7 ile çarpıp, çift hanelerin toplamanı çıkartıp mod 10'nuna bakıyoruz. 10. hanedeki rakama eşit mi diye.
Ve son olarak bütün kuralların uyup uymadığını geri döndürüyoruz.
var isRuleY = ((totalY1 * 7) - totalY2) % 10 == value.substr(9,0); return isEleven && isRuleX && isRuleY;
Oluşturulan her kural değişkeninden sonra (isRule
ile başlayanlar); fonksiyonun false
olma ihtimali dahilinde if bloğu içinde return ettirip sonlandırabilirdik ama ben tercih etmedim. Tercih dahilinde true
ya da false
göndermek yerine, her bir kural sonrası açıklama metni de ("TC Kimlik numarası yalnızca rakamlardan oluşabilir" ya da "Geçersiz TC Kimlik numarası") da yollayabiliriz.
Github Gist olarak fonksiyonun derlenmiş hali:
CodePen'den canlı önizleme:
See the Pen Validate TC ID with Javascript by Ömer Aslanbakan (@Aslanbakan) on CodePen.
Ömer Aslanbakan tarafından tarihinde yayımlandı.