Bir müşteriden inatla gelen doğrulama isteği üzerine T.C. kimlik no’sunun rakamsal olarak “kesinlikle” doğru olmadan formun validate etmemesi için ufak bir araştıma sonucunda şunu buldum.

TC Kimlik numaraları 11 basamaktan oluşmaktadır. İlk 9 basamak arasında kurulan bir algoritma bize 10. basmağı, ilk 10 basamak arasında kurulan algoritma ise bize 11. basamağı verir.
* 11 hanelidir.
* Her hanesi rakamsal değer içerir.
* İlk hane 0 olamaz.
* 1. 3. 5. 7. ve 9. hanelerin toplamının 7 katından, 2. 4. 6. ve 8. hanelerin toplamı çıkartıldığında, elde edilen sonucun 10’a bölümünden kalan, yani Mod10’u bize 10. haneyi verir.
* 1. 2. 3. 4. 5. 6. 7. 8. 9. ve 10. hanelerin toplamından elde edilen sonucun 10’a bölümünden kalan, yani Mod10’u bize 11. haneyi verir.

KaynakBirkaç link ötesinde de şu kodlara rastladımC#
public static bool TcDogrulaV2(string tcKimlikNo){bool returnvalue = false;if (tcKimlikNo.Length == 11){Int64 ATCNO, BTCNO, TcNo;long C1,C2,C3, C4, C5,C6,C7,C8, C9,Q1,Q2;TcNo = Int64.Parse(tcKimlikNo);ATCNO = TcNo / 100;BTCNO = TcNo / 100;C1 = ATCNO % 10; ATCNO = ATCNO / 10 ;C2 = ATCNO % 10; ATCNO = ATCNO / 10 ;C3 = ATCNO % 10; ATCNO = ATCNO / 10 ;C4 = ATCNO % 10; ATCNO = ATCNO / 10 ;C5 = ATCNO % 10; ATCNO = ATCNO / 10 ;C6 = ATCNO % 10; ATCNO = ATCNO / 10 ;C7 = ATCNO % 10; ATCNO = ATCNO / 10 ;C8 = ATCNO % 10; ATCNO = ATCNO / 10 ;C9 = ATCNO % 10; ATCNO = ATCNO / 10 ;Q1 = ((10-((((C1+C3+C5+C7+C9)*3)+(C2+C4+C6+C8))%10))%10);Q2 = ((10-(((((C2+C4+C6+C8)+Q1)*3)+(C1+C3+C5+C7+C9))%10))%10);returnvalue = ((BTCNO * 100)+(Q1 * 10)+Q2 == TcNo);}return returnvalue;}
VB
Public Shared Function TcDogrulaV2(ByVal tcKimlikNo As String) As BooleanDim returnvalue As Boolean = FalseIf (tcKimlikNo.Length <> 11) ThenReturn returnvalueEnd IfDim TcNo As Long = Long.Parse(tcKimlikNo)Dim ATCNO As Long = (TcNo / 100)Dim BTCNO As Long = (TcNo / 100)Dim C1 As Long = (ATCNO Mod 10)ATCNO = (ATCNO / 10)Dim C2 As Long = (ATCNO Mod 10)ATCNO = (ATCNO / 10)Dim C3 As Long = (ATCNO Mod 10)ATCNO = (ATCNO / 10)Dim C4 As Long = (ATCNO Mod 10)ATCNO = (ATCNO / 10)Dim C5 As Long = (ATCNO Mod 10)ATCNO = (ATCNO / 10)Dim C6 As Long = (ATCNO Mod 10)ATCNO = (ATCNO / 10)Dim C7 As Long = (ATCNO Mod 10)ATCNO = (ATCNO / 10)Dim C8 As Long = (ATCNO Mod 10)ATCNO = (ATCNO / 10)Dim C9 As Long = (ATCNO Mod 10)ATCNO = (ATCNO / 10)Dim Q1 As Long =((10-(((((((C1+C3)+C5)+C7)+C9)*3)+(((C2+C4)+C6)+C8))Mod 10))Mod 10)Dim Q2 As Long =((10-(((((((C2+C4)+C6)+C8)+Q1)*3)+((((C1+C3)+C5)+C7)+C9))Mod 10))Mod 10)Return ((((BTCNO * 100) + (Q1 * 10)) + Q2) = TcNo)End Function
Kaynak
VB kodlarını kullanmak istedim ancak rakamları string olarak algılamak gibi garip bir hata ile karşılaştım. zaten yukarıda alıntı olarak belirttiğim doğrulama kurallarından farklı hata mesajları almak istediğimden VB kod üzerinde oynamalar yaparak şu hale getirdim. TcDogrulaV2 ve isNumeric (js) fonksiyonlarını kullanarak olumlu sonuç almış bulunmaktayım.
Function TcDogrulaV2(ByVal tcKimlikNo As String) As BooleanDim returnvalue As Boolean = FalseIf (tcKimlikNo.Length <> 11) ThentcCustom.ErrorMessage = “
TC Kimlik Numarası 11 Haneli Olmalıdır.”Return returnvalueEnd IfDim TcNo As Long = Long.Parse(tcKimlikNo)Dim BTCNO As Long = Long.Parse(Left(tcKimlikNo, 9))Dim C1 As Long = Long.Parse(Mid(tcKimlikNo, 1, 1))Dim C2 As Long = Long.Parse(Mid(tcKimlikNo, 2, 1))Dim C3 As Long = Long.Parse(Mid(tcKimlikNo, 3, 1))Dim C4 As Long = Long.Parse(Mid(tcKimlikNo, 4, 1))Dim C5 As Long = Long.Parse(Mid(tcKimlikNo, 5, 1))Dim C6 As Long = Long.Parse(Mid(tcKimlikNo, 6, 1))Dim C7 As Long = Long.Parse(Mid(tcKimlikNo, 7, 1))Dim C8 As Long = Long.Parse(Mid(tcKimlikNo, 8, 1))Dim C9 As Long = Long.Parse(Mid(tcKimlikNo, 9, 1))Dim Q1 As Long = ((10 – (((((((C1 + C3) + C5) + C7) + C9) * 3) + (((C2 + C4) + C6) + C8)) Mod 10)) Mod 10)Dim Q2 As Long = ((10 – (((((((C2 + C4) + C6) + C8) + Q1) * 3) + ((((C1 + C3) + C5) + C7) + C9)) Mod 10)) Mod 10)’Response.Write((((BTCNO * 100) + (Q1 * 10)) + Q2) & ” – “)’Response.Write(tcKimlikNo)If ((((BTCNO * 100) + (Q1 * 10)) + Q2) = TcNo) ThentcCustom.ErrorMessage = “”ElsetcCustom.ErrorMessage = “
Hatalı TC Kimlik Numarası.”End IfReturn ((((BTCNO * 100) + (Q1 * 10)) + Q2) = TcNo)End Function

Arada ismi geçti bari atlamayayım dedim.var isShift=false;function keyUP(keyCode){if(keyCode==16) isShift = false;}function isNumeric(keyCode){if(keyCode==16) isShift = true;return ((keyCode >= 48 && keyCode <= 57 || keyCode == 8 || (keyCode >= 96 && keyCode <= 105)) && isShift == false);}