عنوان:

‫متدی برای بررسی صحت کد ملی وارد شده


نویسنده: صابر فتح الهی
تاریخ: ۱۳۹۱/۰۸/۱۹ ۱۵:۵۰
آدرس: www.dntips.ir
 در بعضی از سایت‌ها به عنوان داده ورودی کد ملی فرد دریافت می‌شود در این پست می‌خواهیم بررسی کنیم که آیا کد ملی وارد شده از نظر صحت درسا وارد شده است یا خیر.
قبل از نوشتن متد قالب کد ملی را شرح می‌دهیم.

کد ملی شماره ای است 10 رقمی که از سمت چپ سه رقم کد شهرستان ، شش رقم بعدی کد منحصر به فرد برای فرد دارنده و رقم آخر آن هم یک رقم کنترل است که از روی 9 رقم سمت چپ بدست می‌آید. برای بررسی کنترل کد کافی است مجدد از روی 9 رقم سمت چپ رقم کنترل را محاسبه کنیم

از آنجایی که درسیستم کد ملی معمولا قبل از کد  تعدادی صفر وجود دارد.(رقم اول و رقم دوم از سمت چپ کد ملی ممکن است صفر باشد) و در بسیاری از موارد ممکن است کاربر این صفرها را وارد نکرده باشد و یا نرم افزار این صفرها را ذخیره نکرده باشد بهتر است قبل از هر کاری در صورتی که طول کد بزرگتر مساوی 8 و کمتر از 10 باشد  به تعداد لازم (یک تا دو تا صفر) به سمت چپ عدد اضافه کنید. ساختار کد ملی در زیر نشان داده شده است. 

کدهای ملی که همه ارقام آنها مثل هم باشند معتبر نیستند مثل:

۰۰۰۰۰۰۰۰۰۰
۱۱۱۱۱۱۱۱۱۱
۲۲۲۲۲۲۲۲۲۲
۳۳۳۳۳۳۳۳۳۳
۴۴۴۴۴۴۴۴۴۴
۵۵۵۵۵۵۵۵۵۵
۶۶۶۶۶۶۶۶۶۶
۷۷۷۷۷۷۷۷۷۷
۸۸۸۸۸۸۸۸۸۸
۹۹۹۹۹۹۹۹۹۹

روش اعتبار سنجی کد ملی :

دهمین رقم شماره ملی را (از سمت چپ) به عنوان TempAدر نظر می‌گیریم.

یک مقدار TempB در نظر می‌گیریم و آن را برابر با =

(اولین رقم * ۱۰) + ( دومین رقم * ۹ ) + ( سومین رقم * ۸ ) + ( چهارمین رقم * ۷ ) + ( پنجمین رقم * ۶) + ( ششمین رقم * ۵ ) + ( هفتمین رقم * ۴ ) + ( هشتمین رقم * ۳ ) + ( نهمین رقم * ۲ )

قرار می‌دهیم.

مقدار TempC را برابر با = TempB  – (TempB/11)*11 قرار می‌دهیم.

اگر مقدار TempC برابر با صفر باشد و مقدار TempA  برابر TempC  باشد کد ملی صحیح است.

اگر مقدار TempC برابر با ۱ باشد و مقدار TempA  برابر با ۱ باشد کد ملی صحیح است.

اگر مقدار TempC  بزرگتر از ۱ باشد و مقدار TempA برابر با ۱۱ – TempC  باشد کد ملی صحیح است.

در ادامه متد نوشته شده به زبان C#.NET را مشاهده می‌کنید.
public static class Helpers
    {
        /// <summary>
        /// تعیین معتبر بودن کد ملی
        /// </summary>
        /// <param name="nationalCode">کد ملی وارد شده</param>
        /// <returns>
        /// در صورتی که کد ملی صحیح باشد خروجی <c>true</c> و در صورتی که کد ملی اشتباه باشد خروجی <c>false</c> خواهد بود
        /// </returns>
        /// <exception cref="System.Exception"></exception>
        public static Boolean IsValidNationalCode(this String nationalCode)
        {
           //در صورتی که کد ملی وارد شده تهی باشد
if (String.IsNullOrEmpty(nationalCode)) throw new Exception("لطفا کد ملی را صحیح وارد نمایید");
//در صورتی که کد ملی وارد شده طولش کمتر از 10 رقم باشد if (nationalCode.Length != 10) throw new Exception("طول کد ملی باید ده کاراکتر باشد"); //در صورتی که کد ملی ده رقم عددی نباشد var regex = new Regex(@"\d{10}"); if (!regex.IsMatch(nationalCode)) throw new Exception("کد ملی تشکیل شده از ده رقم عددی می‌باشد؛ لطفا کد ملی را صحیح وارد نمایید"); //در صورتی که رقم‌های کد ملی وارد شده یکسان باشد var allDigitEqual = new[]{"0000000000","1111111111","2222222222","3333333333","4444444444","5555555555","6666666666","7777777777","8888888888","9999999999"}; if (allDigitEqual.Contains(nationalCode)) return false;
//عملیات شرح داده شده در بالا var chArray = nationalCode.ToCharArray(); var num0 = Convert.ToInt32(chArray[0].ToString())*10; var num2 = Convert.ToInt32(chArray[1].ToString())*9; var num3 = Convert.ToInt32(chArray[2].ToString())*8; var num4 = Convert.ToInt32(chArray[3].ToString())*7; var num5 = Convert.ToInt32(chArray[4].ToString())*6; var num6 = Convert.ToInt32(chArray[5].ToString())*5; var num7 = Convert.ToInt32(chArray[6].ToString())*4; var num8 = Convert.ToInt32(chArray[7].ToString())*3; var num9 = Convert.ToInt32(chArray[8].ToString())*2; var a = Convert.ToInt32(chArray[9].ToString()); var b = (((((((num0 + num2) + num3) + num4) + num5) + num6) + num7) + num8) + num9; var c = b%11; return (((c < 2) && (a == c)) || ((c >= 2) && ((11 - c) == a))); } }
نحوه استفاده از این متد به این صورت می‌باشد:

if(TextBoxNationalCode.Text.IsValidNationalCode ())
     //some code

//OR

if(Helpers.IsValidNationalCode (TextBoxNationalCode.Text))
     //some code
موفق وموید باشید

نظرات

  • مهمان در ۱۳۹۱/۰۸/۲۱ ۹:۷
    نحوه استفاده از این کد بدون using system.linq چگونه است؟
    • صابر فتح الهی در ۱۳۹۱/۰۸/۲۱ ۹:۴۸
      سلام
      من که منطور شمارو نفهمیدم.
      اما اگر منظورتون این خطه:
      var allDigitEqual = new[]{"0000000000","1111111111","2222222222","3333333333","4444444444","5555555555","6666666666","7777777777","8888888888","9999999999"};
                  if (allDigitEqual.Contains(nationalCode)) return false;
      که شما می‌تونی به جای اینکار پارامتر allDigitEqual را با مقادیر "1....1" و "2....2" و غیره از نطر تساوی با if بررسی کنی البته باید این شرطهارو OR کنید.
      یعنی این قسمت به این شکل بنویسید.
      if (nationalCode == "1111111111" ||
          nationalCode == "0000000000" ||
          nationalCode == "2222222222" ||
          nationalCode == "3333333333" ||
          nationalCode == "4444444444" ||
          nationalCode == "5555555555" ||
          nationalCode == "6666666666" ||
          nationalCode == "7777777777" ||
          nationalCode == "8888888888" ||
          nationalCode == "9999999999")
               return false;

      امیدوارم منظور شمارو درست فهمیده باشم.
  • مهمان در ۱۳۹۱/۰۹/۱۶ ۱۹:۴۰
    سلام
    آقای مهندس فتح الهی لازم دونستم بابت ارائه این کد از شما تشکر کنم
    موفق باشید
  • مهدی موسوی در ۱۳۹۲/۰۱/۰۶ ۲۰:۲۸
    سلام.
    من از این مطلب به مطلب شما رسیدم. اونطور که قبلا خونده بودم، کد 1111111111 کد ملی معتبری هستش بنابراین نمیشه در مورد کدهای مشابه نیز زیاد مطمئن بود چرا که ممکنه اونها به افراد دیگه نیز Assign شده باشه. نکته دوم اینکه این بخش از کد شما واقعا آزاردهنده هستش:

     var chArray = nationalCode.ToCharArray();
    var num0 = Convert.ToInt32(chArray[0].ToString())*10;
    var num2 = Convert.ToInt32(chArray[1].ToString())*9;
    var num3 = Convert.ToInt32(chArray[2].ToString())*8;
    var num4 = Convert.ToInt32(chArray[3].ToString())*7;
    var num5 = Convert.ToInt32(chArray[4].ToString())*6;
    var num6 = Convert.ToInt32(chArray[5].ToString())*5;
    var num7 = Convert.ToInt32(chArray[6].ToString())*4;
    var num8 = Convert.ToInt32(chArray[7].ToString())*3;
    var num9 = Convert.ToInt32(chArray[8].ToString())*2;
    var a = Convert.ToInt32(chArray[9].ToString());
    
    var b = (((((((num0 + num2) + num3) + num4) + num5) + num6) + num7) + num8) + num9;
    var c = b%11;
    
    return (((c < 2) && (a == c)) || ((c >= 2) && ((11 - c) == a)));

    شما می‌تونید کد فوق رو بدین شکل بازنویسی کنید:

    int result = 0, controlNr = (int)(input[9] - 48);
    for (int i = 0; i < input.Length - 1; i++)
        result += (input[i] - 48) * (10 - i);
    
    int remainder = result % 11;
    bool isValid = controlNr == (remainder < 2 ? remainder : 11 - remainder);
    با فرض اینکه input، رشته حاوی کد ملی باشه. در مورد اون بخش از کد که اعداد 1111111111 و 2222222222 و ... رو مقایسه کرده اید نیز، می‌تونید از Regular Expression‌ها بهره ببرید تا کدتون بسیار خواناتر بشه.

    موفق باشید.
    • صابر فتح الهی در ۱۳۹۲/۰۱/۰۶ ۲۳:۳
      بله این قسمت کد آزار دهنده هست و می‌تواند بهتر شود، در ضمن کد‌های یکسان طبق الگوریتم خود سازمان ثبت احوال نامعتبر هست در لینکی که دادین به همین موضوع نیز اشاره شده است.
      نکته دوم اینکه ممنون میشم Regular Expression مورد نظر بنویسین، چون من زیاد باهاش کار نکردم.
       موفق وموید باشید
      • مهدی موسوی در ۱۳۹۲/۰۱/۰۷ ۸:۱۸
        سلام.
        با این Pattern میشه اون اعداد رو جدا کرد:
        (\d)\1{9}
        به بیان دیگه، کافیه تا بدین شکل عمل کنیم:
        if (Regex.IsMatch(input, @"(\d)\1{9}"))
        {
            //Invalid Code...
        }
        موفق باشید.

        پ.ن.: برای افرادی که هنوز متوجه موضوع نشدن باید عرض کنم که میشه جای این سه خط،
        var allDigitEqual = new[] { "0000000000", "1111111111", "2222222222", "3333333333", "4444444444", "5555555555", "6666666666", "7777777777", "8888888888", "9999999999" };
        if (allDigitEqual.Contains(nationalCode))
            return false;

        اینو نوشت:
        if (Regex.IsMatch(nationalCode, @"(\d)\1{9}"))
            return false;
  • بیاگوی در ۱۳۹۲/۰۱/۱۳ ۱۷:۳۱
    سلام. من کدتون رو بهینه و بازنویسی کردم. خوشحال می‌شم تست کنید ببینید رفتار کد عوض نشده باشه:
    public static bool IsValidIranianNationalCode(string input)
    {
        // input has 10 digits that all of them are not equal
        if (!System.Text.RegularExpressions.Regex.IsMatch(input, @"^(?!(\d)\1{9})\d{10}$"))
            return false;
    
        var check = Convert.ToInt32(input.Substring(9, 1));
        var sum = Enumerable.Range(0, 9)
            .Select(x => Convert.ToInt32(input.Substring(x, 1)) * (10 - x))
            .Sum() % 11;
    
        return sum < 2 && check == sum || sum >= 2 && check + sum == 11;
    }
    
    در regex از negative lookahead استفاده شده که بررسی‌شه هر ده عدد یکی نباشن، از Substring استفاده‌شده که با توجه به پیاده‌سازی کلاس String به نظر من خیلی بهنیه هست، پرانتزها هم حذف شدند چون بدون پرانتز با توجه به اولویت عملگرها همان معنی را می‌دهد.
    • صابر فتح الهی در ۱۳۹۲/۰۱/۱۴ ۸:۲۹
      به نطر که درست هست، از همکاری شما متشکرم
    • مهمان در ۱۳۹۲/۰۸/۲۶ ۱۳:۵۹
      با استعلام از سازمان ثبت احوال متوجه شدیم که کد ملی 172942284 کاملا صحیحه ولی کد شما اون رو نادرست می‌دونه.
      • صابر فتح الهی در ۱۳۹۲/۰۸/۲۶ ۱۹:۱۲
        کدها اصلاح شد
        namespace ConsoleApplicationTest
        {
            class Program
            {
                static void Main(string[] args)
                {
                    Console.WriteLine("0172942284 => {0}", "0172942284".IsValidNationalCode());
                    Console.WriteLine("1000000001 => {0}", "1000000001".IsValidNationalCode());
                }
            }
        
            public static class Helpers
            {
                public static Boolean IsValidNationalCode(this String nationalCode)
                {
                    if (String.IsNullOrEmpty(nationalCode))
                        throw new Exception("لطفا کد ملی را صحیح وارد نمایید");
        
                    if (nationalCode.Length != 10)
                        throw new Exception("طول کد ملی باید ده کاراکتر باشد");
        
                    var regex = new Regex(@"[^0-9] ");
                    if (!regex.IsMatch(nationalCode))
                        throw new Exception("کد ملی تشکیل شده از ده رقم عددی می‌باشد؛ لطفا کد ملی را صحیح وارد نمایید");
        
                    if (!Regex.IsMatch(nationalCode, @"^(?!(\d)\1{9})\d{10}$"))
                        return false;
        
                    var check = Convert.ToInt32(nationalCode.Substring(9, 1));
                    var result = Enumerable.Range(0, 9)
                        .Select(x => Convert.ToInt32(nationalCode.Substring(x, 1)) * (10 - x))
                        .Sum() % 11;
        
                    int remainder = result % 11;
                    return check == (remainder < 2 ? remainder : 11 - remainder);
        
                }
            }
        }

        پ.ن. لازم به ذکر است از کدهای اقای بیاگوی استفاده شده است.
      • بیاگوی در ۱۳۹۲/۰۸/۲۶ ۲۱:۴۴
        اگر کارت‌های ملی که شمارهٔ شناسنامهٔ ۹ و ۸ رقمی دارند را دیده باشید متوجه می‌شوید که صفرهای اول جز شمارهٔ ملی است. به هر حال اگر به هر دلیل صفرهای اول را به گونه‌ای پاک‌کرده‌اید می‌توان کد را اینگونه نوشت که کدهای ۹ یا ۸ رفمی را پس از افزوده‌شدن صفر مانند کدهای ۱۰ رقمی صحت‌سنجی کند:
                public static bool IsValidIranianNationalCode(string input)
                {
                    input = input.PadLeft(10, '0');
        
                    if (!Regex.IsMatch(input, @"^\d{10}$"))
                        return false;
        
                    var check = Convert.ToInt32(input.Substring(9, 1));
                    var sum = Enumerable.Range(0, 9)
                        .Select(x => Convert.ToInt32(input.Substring(x, 1)) * (10 - x))
                        .Sum() % 11;
        
                    return sum < 2 && check == sum || sum >= 2 && check + sum == 11;
                }
        راستی اعداد یکسان نامعتبر نیستhttp://www.fardanews.com/fa/news/127747
        برای زبان‌های دیگر این کد https://gist.github.com/ebraminio/5292017
  • سجـــــــاد ف در ۱۳۹۲/۰۶/۲۸ ۸:۴۶
    با سلام
    اینم واسه شناسه ملی اشخاص حقوقی منیع
    public bool IsValidIranianLegalCode(string input)
            {
                //input has 11 digits that all of them are not equal
                if (!Regex.IsMatch(input, @"^(?!(\d)\1{10})\d{11}$"))
                    return false;
    
                var check = Convert.ToInt32(input.Substring(10, 1));
                int dec = Convert.ToInt32(input.Substring(9, 1)) + 2;
                int[] Coef = new int[10] { 29, 27, 23, 19, 17, 29, 27, 23, 19, 17 };
    
                var sum = Enumerable.Range(0, 10)
                              .Select(x => (Convert.ToInt32(input.Substring(x, 1)) + dec) * Coef[x])
                              .Sum() % 11;
    
                return sum == check;
            }

    • منیژه محمدی در ۱۳۹۲/۰۹/۰۸ ۱۸:۳۲
      سلام؛ دوتا سوال داشتم. آیا ابتدای شناسه ملی اشخاص حقوقی میتواند با 4 تا صفر شروع شود؟ میشه کد جاوا اسکریپت آن را هم بدهید ؟
      • صابر فتح الهی در ۱۳۹۲/۰۹/۰۹ ۱۳:۲۹
        سلام
        می‌تونین چک کنین فکر نکنم معتبر باشه
        کد جاوا اسکریپت تشخیص صحت کد ملی، منبعش این سایته
        function checkCodeMeli(code)
        {
          
          var L=code.length;
          
          if(L<8 || parseInt(code,10)==0) return false;
          code=('0000'+code).substr(L+4-10);
          if(parseInt(code.substr(3,6),10)==0) return false;
          var c=parseInt(code.substr(9,1),10);
          var s=0;
          for(var i=0;i<9;i++)
            s+=parseInt(code.substr(i,1),10)*(10-i);
          s=s%11;
          return (s<2 && c==s) || (s>=2 && c==(11-s));
        return true;
        }


        • صابر فتح الهی در ۱۳۹۲/۰۹/۰۹ ۱۳:۵۶
          اینم برای تشخیص صحت کد ملی اشخاص حقوقی با استفاده از جاوا اسکریپت
          function checkCodeMeli(code)
          {
            
            var L=code.length;
            
            if(L<11 || parseInt(code,10)==0) return false;
            
            if(parseInt(code.substr(3,6),10)==0) return false;
            var c=parseInt(code.substr(10,1),10);
            var d=parseInt(code.substr(9,1),10)+2;
            var z=new Array(29,27,23,19,17);
            var s=0;
            for(var i=0;i<10;i++)
              s+=(d+parseInt(code.substr(i,1),10))*z[i%5];
            s=s%11;if(s==10) s=0;
            return (c==s);
          
          }



          • منیژه محمدی در ۱۳۹۲/۰۹/۱۱ ۲۳:۲۵
            در مورد کد اقتصادی چطور ؟ آن را هم میدونید به چه صورت هست ؟ و کد اعتبار سنجی به چه صورت هست
            • صابر فتح الهی در ۱۳۹۲/۰۹/۱۲ ۱۵:۴۰
              فعلا نمیدونم بررسی نکردم
    • ایمان محمدی در ۱۳۹۴/۰۵/۱۸ ۱:۳۹
      این مورد را فراموش کردید:
      "اگر باقیمانده برابر 10 باشد ، باقیمانده را برابر 0 قرار می‌دهیم"
      sum = sum == 10 ? 0 : sum;
      return sum == check;
  • مهمان در ۱۳۹۲/۰۸/۰۶ ۱۳:۵۹
    عجیبه !
    کد ملی 1000000001  که همه میدونیم، اشتباهه رو معتبر می‌دونه !
    • صابر فتح الهی در ۱۳۹۲/۰۸/۰۷ ۰:۵۷
      طبق فرمول باید صحیح باشه منم چن سایت آنلاین بررسی کردم حق با شماست دارم بررسی می‌کنم
    • مهمان در ۱۳۹۲/۰۸/۱۰ ۱۲:۵۰
      عذر میخوام،
      چرا کدملی 1000000001 اشتباه است؟ طبق فرمولی که معرفی شده که صحیحه.
      (باقیمانده 1*10 تقسیم بر 11 برابر با 10 میشه و چون این عدد بزرگتر از 1 است باید از 11 کسر بشه که نتیجه میشه 1)

      آیا فرمول دقیق‌تری برای تشخیص صحت کدملی وجود دارد؟
      به چه علت و بر چه اساسی کد ملی مذکور اشتباه است؟
      آیا اداره ثبت احوال فرمول دقیق تشخیص صحت کدملی را در ارائه داده است؟

      و ضمنا آیا بررسی یکسان بودن تمام ارقام ضروری است؟ بنظر میرسه نیازی اصلا به این بررسی وجود نداشته باشد. مثلا برای کدملی که هر ده رقم صفر است هیچگاه رقم کنترل صحیح نخواهد بود.
      و همچنین در این لینک هیچ اشاره ای به این موضوع نشده است.

      با تشکر
      • دادگر در ۱۳۹۲/۰۸/۱۰ ۱۳:۳۹
        سلام
        دوست عزیز ویکیپدیا منبع معتبری در این زمینه نمی‌باشد چون هر فردی می‌تواند مقاله در آن ثبت کند و افرادی که سابقه بیشتری داشته باشند می‌توانند آنها را اصلاح و... نمایند
    • مهمان در ۱۳۹۲/۰۸/۱۰ ۱۳:۲۰
      راستی موضوعی را فراموش کردم مطرح کنم.
      واقعیتش من نیاز دارم کدملی را دریافت کنم که واقعی باشه اونم به معنای واقعی کلمه. عرض می‌کنم.

      همانطور که میدانید (مطابق با تصویری که در ویکیا قرار دارد و قبلا لینکش را قرار دادم) سه رقم اول کد ملی (از چپ) مربوط به کد شهرستان محل صدور شناسنامه فرد است. حالا باید ما لیست کدهای شهرستان‌ها را داشته باشیم تا بتونیم کدملی را بپذیریم که مربوط باشه به یک شهرستانی که وجود خارجی داره (به عبارتی از بین تمام ترکیبات ممکن، اگر اشتباه نکنم 10 به قوه‌ی 3 که به بیان دیگر 1 تا 999 که میشه 1000 مورد؛ من اطلاعی از تعداد شهرستان‌های ایران ندارم ولی چیزی که در اینجا می‌بینم بعید میرسه به هزار برسه البته از صحت و سقم آن بی اطلاع هستم)

      نکته‌ی بعدی مرتبط هست به کدمنحصربفرد (شش رقم از راست بدون در نظر گرفتن رقم کنترل) این هم فکر کنم با یک قاعده و قانونی مقداردهی شده است یا شایدم نه بصورت ترتیبی باشه مثلا از 100001 (یکصد و یک هزار) آغاز شده و یکی یکی افزایش پیدا کرده.

      به هر حال اگر اطلاعات راجب این موضوع دارید لطفا دریغ نفرمایید.
      منتظر پاسخ دوستان هستم.
      با تشکر.
      • صابر فتح الهی در ۱۳۹۲/۰۸/۱۱ ۱۲:۲۵
        دوست گلم سلام
        طبق فرمول‌های ارائه شده با بررسی کد ملی به طریق بالا که اگر اینترنت هم جستجو بزنین فرمول هاش ارائه شده این اعداد با روش بالا بررسی شده و در صورت عدم اعتبار کد ملی به شما خروجی میده. روشی که شما می‌خوای پیش بگیری اینه که باید برین و لیست کد تمام شهرستان‌های ایران بگیرین و توی برنامه به کار ببندین. که به نظرم روش جالبی نیست
    • صابر فتح الهی در ۱۳۹۲/۰۸/۲۷ ۱۰:۱۰
      ظاهرا در صورتی که عدد قرینه باشه جواب درست در میاد

  • منیژه محمدی در ۱۳۹۲/۰۹/۰۳ ۷:۵
    سلام 
    اگر بخواهیم صحت کد ملی را از طریق jqueryvalidation چک کنیم کد ان به چه صورت خواهد بود
    ممنون میشم این را هم تکه کد را هم اضافه کنید
    • محسن خان در ۱۳۹۲/۰۹/۰۳ ۹:۲۱
      آقای بیاگوی چند نظر بالاتر کدهای جاوا اسکریپتی آن‌را قرار دادند (قسمت برای زبان‌های دیگر این کد ...).
  • مهمان در ۱۳۹۲/۱۲/۲۳ ۱۹:۵۷
    لطف کنید کد تشخیص کد ملی را به زبان vb 2008 برام بزارید ممنون
    • صابر فتح الهی در ۱۳۹۲/۱۲/۲۳ ۲۲:۳۶
      سلام
      من از یک مبدل آنلاین استفاده کردم به این نتیجه رسیدم.
      Namespace ConsoleApplicationTest
      Class Program
      Private Shared Sub Main(args As String())
      Console.WriteLine("0172942284 => {0}", "0172942284".IsValidNationalCode())
      Console.WriteLine("1000000001 => {0}", "1000000001".IsValidNationalCode())
      End Sub
      End Class
      
      Public NotInheritable Class Helpers
      Private Sub New()
      End Sub
      <System.Runtime.CompilerServices.Extension> _
      Public Shared Function IsValidNationalCode(nationalCode As [String]) As [Boolean]
      If [String].IsNullOrEmpty(nationalCode) Then
      Throw New Exception("لطفا کد ملی را صحیح وارد نمایید")
      End If
      
      If nationalCode.Length <> 10 Then
      Throw New Exception("طول کد ملی باید ده کاراکتر باشد")
      End If
      
      Dim regex__1 = New Regex("[^0-9]<span> </span>")
      If Not regex__1.IsMatch(nationalCode) Then
      Throw New Exception("کد ملی تشکیل شده از ده رقم عددی می‌باشد؛ لطفا کد ملی را صحیح وارد نمایید")
      End If
      
      If Not Regex.IsMatch(nationalCode, "^(?!(\d)\1{9})\d{10}$") Then
      Return False
      End If
      
      Dim check = Convert.ToInt32(nationalCode.Substring(9, 1))
      Dim result = Enumerable.Range(0, 9).[Select](Function(x) Convert.ToInt32(nationalCode.Substring(x, 1)) * (10 - x)).Sum() Mod 11
      
      Dim remainder As Integer = result Mod 11
      Return check = (If(remainder < 2, remainder, 11 - remainder))
      
      End Function
      End Class
      End Namespace
  • مهمان در ۱۳۹۳/۰۴/۰۱ ۱۵:۰
    با سلام،

    تو عبارت "مقدار TempC را برابر با = TempB  – (TempB/11)*11 قرار می‌دهیم. " منظور اینه که C باید برابر با باقیمانده تقسیم صحیح TempB بر 11 باشه دیگه؟

    چون TempB  – (TempB/11)*11 که مقدارش 0 میشه به نظر.

    ممنون
  • مهمان در ۱۳۹۳/۰۵/۰۶ ۱۵:۶
    عذرخواهی می‌کنم ولی کد ملی من در این متد نا معتبر است !
    و یا مثل این کد ملی "0081037511" که معتبر است ولی حتی متد اصلاح شده شما درون exception  زیر می‌افتد
    throw new Exception("کد ملی تشکیل شده از ده رقم عددی می‌باشد؛ لطفا کد ملی را صحیح وارد نمایید"); 
    • محسن خان در ۱۳۹۳/۰۵/۰۸ ۱۲:۱۰
      خوب کاربر رو اینقدر عذاب ندید. همون قسمت بررسی با Regex کافی هست. بیشتر نیازی نیست.
      input = input.PadLeft(10, '0'); 
      if (!Regex.IsMatch(input, @"^\d{10}$"))
              return false;
  • وحید نصیری در ۱۳۹۶/۰۱/۲۷ ۱۴:۵۸
    جهت اطلاع
    متد IsValidIranianNationalCode به کتابخانه‌ی DNTPersianUtils.Core اضافه شد با این آزمون‌های واحد.