صحت اعتبار شناسه ملی دارای الگوریتمی است که با کمی جستجو پیدا میشه.
نمونه کد زیر این کار رو در C# انجام میده:
public static bool IsValidCompanyCode(string companyCode)
{
var trimmedCompanyCode = companyCode != null ? companyCode.Trim() : null;
//remark: در صورتی که شناسه ملی وارد شده تهی باشد
if (string.IsNullOrEmpty(trimmedCompanyCode))
return false;
long tempCompanyCode;
byte c, c10;
int r, n;
//remark: در صورتی که طول شناسه ملی وارد شده
// مخالف 10 رقم
// یا غیر عددی
// یا رشته های خاص
// باشد
if (trimmedCompanyCode.Length != 11
|| !long.TryParse(trimmedCompanyCode, out tempCompanyCode)
|| trimmedCompanyCode.Contains("-")
|| trimmedCompanyCode.Contains("+")
|| new string[] { "00000000000", "11111111111", "22222222222", "33333333333", "44444444444",
"55555555555", "66666666666", "77777777777", "88888888888", "99999999999"
}
.Contains(trimmedCompanyCode))
return false;
byte.TryParse(trimmedCompanyCode.Substring(10, 1), out c);
byte.TryParse(trimmedCompanyCode.Substring(9, 1), out c10);
n = new int[] {
(byte.Parse(trimmedCompanyCode.Substring(0, 1)) + c10 + 2) * 29,
(byte.Parse(trimmedCompanyCode.Substring(1, 1)) + c10 + 2) * 27,
(byte.Parse(trimmedCompanyCode.Substring(2, 1)) + c10 + 2) * 23,
(byte.Parse(trimmedCompanyCode.Substring(3, 1)) + c10 + 2) * 19,
(byte.Parse(trimmedCompanyCode.Substring(4, 1)) + c10 + 2) * 17,
(byte.Parse(trimmedCompanyCode.Substring(5, 1)) + c10 + 2) * 29,
(byte.Parse(trimmedCompanyCode.Substring(6, 1)) + c10 + 2) * 27,
(byte.Parse(trimmedCompanyCode.Substring(7, 1)) + c10 + 2) * 23,
(byte.Parse(trimmedCompanyCode.Substring(8, 1)) + c10 + 2) * 19,
(byte.Parse(trimmedCompanyCode.Substring(9, 1)) + c10 + 2) * 17
}
.Sum();
Math.DivRem(n, 11, out r);
if (r == 10)
r = 0;
if (r == c)
return true;
return false;
}