رفتن به مطلب

گاهی اوقات در برنامه‌ها و وب‌سایت‌ها نیاز داریم که کد ملی کاربران را دریافت کنیم. شاید تا به حال تنها کاری که برای اعتبارسنجی انجام می‌دادیم، بررسی این بود که کد ملی دقیقاً ده رقم داشته باشد و فقط شامل اعداد باشد. در این حالت، کاربر می‌توانست با وارد کردن یک عدد ده‌رقمی غیرمعتبر به راحتی از این مرحله عبور کند.

اخیراً به دلیل نیاز شخصی‌ام، کدی برای بررسی صحت کد ملی نوشتم. از آنجا که مطمئنم افراد زیادی هم به این موضوع نیاز دارند، در این مقاله توابع و مراحل انجام کار را توضیح می‌دهم.

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

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

الگوریتم محاسبه
  1. برای محاسبه رقم کنترلی، هر رقم را در موقعیتش (از رقم یک تا رقم نه از چپ به راست) ضرب کرده و همه نتایج را با هم جمع می‌کنیم.

  2. مجموع به‌دست‌آمده را بر ۱۱ تقسیم می‌کنیم.

  3. اگر باقیمانده کمتر از ۲ باشد، رقم کنترلی باید برابر باقیمانده باشد؛ در غیر این صورت، رقم کنترلی برابر است با ۱۱ منهای باقیمانده.

مثال: آیا کد 7731689951 معتبر است؟

محاسبه:

7×10 + 7×9 + 3×8 + 1×7 + 6×6 + 8×5 + 9×4 + 9×3 + 5×2 = 313
313 ÷ 11 = 28 (باقیمانده = 5)

چون باقیمانده (۵) بزرگ‌تر یا برابر ۲ است، رقم کنترلی باید ۱۱ - ۵ = ۶ باشد. اما در کد واردشده، رقم آخر ۱ است. پس این کد ملی معتبر نیست.

نمونه کد جاوااسکریپت:

/**
 * Validates an Iranian National Code based on the official algorithm.
 * 
 * @param {string} nationalCode - The national code to validate
 * @returns {boolean} - True if valid, false otherwise
 */
function validateIranianNationalCode(nationalCode = '') {
    // Remove non-numeric characters
    const cleanedCode = (nationalCode || '').replace(/[^0-9]/g, '');
    
    // Check length (must be 8 to 10 digits)
    const codeLength = cleanedCode.length;
    if (codeLength < 8 || codeLength > 10) {
        return false;
    }

    // Standardize to 10 digits by padding with leading zeros
    const standardizedCode = cleanedCode.padStart(10, '0');
    
    // Check if all digits are the same
    if (standardizedCode.split('').every(digit => digit === standardizedCode[0])) {
        return false;
    }

    // Extract check digit (last digit)
    const checkDigit = parseInt(standardizedCode.slice(-1));
    const digits = standardizedCode.slice(0, -1).split('').map(Number);

    // Calculate weighted sum (weights: 10 down to 2)
    const sum = digits.reduce((acc, digit, i) => acc + digit * (10 - i), 0);

    // Compute remainder and check digit
    const remainder = sum % 11;
    const calculatedCheckDigit = remainder < 2 ? remainder : 11 - remainder;

    // Return true if check digits match
    return calculatedCheckDigit === checkDigit;
}

// Test
console.log(validateIranianNationalCode('6587452158')); // false

برای راحتی کار، این الگوریتم را به زبان‌های برنامه‌نویسی مختلف پیاده‌سازی کرده‌ام و در گیت‌هاب قرار داده‌ام. کد در Repository در دسترس است و توضیحات تکمیلی در فایل README نوشته شده است.

مثال زنده

برای استفاده از این پروژه میتوانید از صفحه زیر استفاده کنید.

jalalvandi.github.io/IR-NationalCode

توجه فرمایید اعدادی که وارد میکنید در هیچ جایی ذخیره نخواهند شد.


توضیحات: فایل Index داخل repository بعنوان مثال قرار داده شده است

بازخورد کاربر

دیدگاه‌های پیشنهاد شده

هیچ دیدگاهی برای نمایش وجود دارد.

دیدگاه خود را ارسال کنید

از استفاده از کلمات رکیک و خلاف قوانین و غیر مرتبط با موضوع خودداری کنید ...
توجه: مطلب ارسالی شما پس از تایید مدیریت برای همه قابل رویت خواهد بود.

مهمان
افزودن دیدگاه...