document.write('
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. using System;
  2.  
  3. namespace RSAID
  4. {
  5.     public sealed class ValidatedRSAID
  6.     {
  7.         public readonly string IDNumber;
  8.         public readonly bool IsValid;
  9.         public readonly DateTime? DateOfBirth;
  10.         public readonly Gender? Gender;
  11.         public readonly bool? IsCitizen;
  12.  
  13.         public ValidatedRSAID(string idNumber)
  14.         {
  15.             IDNumber = idNumber;
  16.             DateOfBirth = null;
  17.             Gender = null;
  18.             IsCitizen = false;
  19.             IsValid = false;
  20.  
  21.             // empty string or not 13 digits? then invalid - return.
  22.             if (string.IsNullOrEmpty(IDNumber) || IDNumber.Length != 13)
  23.                 return;
  24.  
  25.             int i;
  26.  
  27.             // ensure the number contains 13 digits, so we can avoid the expense of a try-catch block later on
  28.             for (i = 0; i < 13; i++)
  29.                 if (idNumber[i] < \'0\' || idNumber[i] > \'9\')
  30.                     return;
  31.  
  32.             i = 0;
  33.  
  34.             // Get all the digits
  35.             var yy = ((idNumber[i++] - \'0\') * 10) + (idNumber[i++] - \'0\');
  36.             var mm = ((idNumber[i++] - \'0\') * 10) + (idNumber[i++] - \'0\');
  37.             var dd = ((idNumber[i++] - \'0\') * 10) + (idNumber[i++] - \'0\');
  38.             var genderValue = (idNumber[i++] - \'0\');
  39.             i += 3; // series. 3 digits
  40.             var citizenValue = (idNumber[i++] - \'0\');
  41.             i++; // uniform. 1 digits.
  42.             int checkDigit = (idNumber[i] - \'0\');
  43.  
  44.             // Derive member values
  45.             Gender = (genderValue < 5 ? RSAID.Gender.Female : RSAID.Gender.Male);
  46.             IsCitizen = citizenValue == 0;
  47.  
  48.             // detect invalid date of birth digits
  49.             if (yy < 0 || yy > 99 || mm < 1 || mm > 12 || dd < 1 || dd > 31 ||
  50.                (dd > 30 && (mm == 4 || mm == 9 || mm == 6 || mm == 11)))
  51.                 return;
  52.  
  53.             var currentYear = DateTime.Now.Year % 100;
  54.             yy += (yy > currentYear ? 1900 : 2000);
  55.  
  56.             // detect invalid date for febrauary
  57.             if (mm == 2 && dd > (28 + (DateTime.IsLeapYear(yy) ? 1 : 0)))
  58.                 return;
  59.  
  60.             DateOfBirth = new DateTime(yy, mm, dd);
  61.  
  62.             var check = CalculateControlDigit(IDNumber);
  63.  
  64.             IsValid = checkDigit == check;
  65.         }
  66.  
  67.         private static Int32 CalculateControlDigit(string idNumber)
  68.         {
  69.             var oddDigits = 0;
  70.             var evenDigits = 0;
  71.             var evenCheck = 0;
  72.  
  73.             for (var i = 0; i < 12; i++)
  74.             {
  75.                 var digit = idNumber[i] - \'0\';
  76.  
  77.                 if (i % 2 == 0)
  78.                     oddDigits += digit;
  79.                 else
  80.                     evenDigits = (evenDigits * 10) + digit;
  81.             }
  82.  
  83.             for (evenDigits *= 2; evenDigits > 0; evenDigits = evenDigits / 10)
  84.                 evenCheck += evenDigits % 10;
  85.  
  86.             return 10 - ((oddDigits + evenCheck) % 10);
  87.         }
  88.     }
  89. }
');