صحت اعتبار شناسه ملی دارای الگوریتمی است که با کمی جستجو پیدا میشه.
نمونه کد زیر این کار رو در 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; }