โปรแกรมเลขบัตรประจำตัวประชาชน โดยใช้ Java

| ไอที | Java | 10403

โปรแกรมเลขบัตรประจำตัวประชาชน โดยใช้ Java

บทความนี้เราลองมาเขียนโปรแกรมเกี่ยวกับเลขบัตรประชาชนกัน

โปรแกรมแรกเป็นโปรแกรมในการหาเลขประจำตัว ตัวสุดท้าย หรือเรียกกันว่า Check Digit

ใครที่ชอบเล่นเกม จะเห็นว่า บางครั้งการสมัคร ID แต่ละครั้ง ต้องใช้เลขบัตรประจำตัวประชาชนในการสมัครด้วย ก็เผื่อใครมีหลายไอดีจะโดนแบน อะไรประมาณนี้ หากเราใส่เลขประจำตัวเรื่อยเปลื่ย ที่ไม่ถูกต้อง ระบบก็จะแจ้งเตือนออกมา ว่าใส่เลขประจำตัวผิด

ระบบทำได้ยังไง ว่าเรากรอกเลขประจำตัวผิดหรือถูก หากจะเก็บข้อมูลของคนทั้งประเทศ ก็เยอะเกินไป คงไม่ไหวแน่ ดังนั้น ระบบ จึงต้องมีการตรวจสอบเลขที่กรอกเข้ามา โดยบางระบบเช็คที่ตัวเลขตัวสุดท้ายครับ

แล้วมันเช็คยังไงละ ???

เช่น มีเลขประจำตัวดังนี้ 3813459837559 เลขสุดท้ายหรือ check digit ก็คือเลข 9 ระบบก็จะทำการ บวก ลบ คูณ หาร จากเลขสิบสองหลักแรก ถ้าผลที่ออกมาได้เลข 9 แสดงว่า เลขประจำตัวนั้นผ่าน หากเลขที่ออกมาไม่ใช่เลข 9 แสดงว่า เลขประจำตัวนั้นผิด ซึ่งวิธีหาตัวเลขตัวสุดท้าย ก็คือ

1. เอาเลข 12 หลักแรกมา เขียนแยกหลักกัน แล้วเอาไปคูณกับเลขประจำหลักของมัน

ตัวตั้ง 3 8 1 3 4 5 9 8 3 7 5 5
ตัวคูณ 13 12 11 10 9 8 7 6 5 4 3 2
ผลลัพธ์ 39 96 11 30 36 40 63 48 15 28 15 10


2. เอาผลลัพธ์ที่ได้ทั้งหมดมาบวกกัน 39+96+11+30+36+40+63+48+15+28+15+10=431

3. เอาเลขที่ได้ มา mod 11 ( หารเอาเศษ ) จะได้ 431 mod 11 = 2

4. เอา 11 ตั้งแล้วเอามาลบกับเลขที่ได้เมื่อกี้ จะได้ 11-2=9

เลขที่ได้ คือ 9 ก็เอาไปตรวจสอบว่าเลขสุดท้ายคือ 9 หรือเปล่า ถ้าใช่ก็แสดงว่ากรอกถูก ถ้าไม่ใช่ก็แสดงว่ากรอกผิด
ถ้าเลขที่ได้เป็นเลขสองหลักให้เอาหลักสุดท้าย เช่น ได้ 10 ให้เอา 0

ต่อไปเรามาเขียนโปรแกรม รับค่าตัวเลข 12 ค่าแล้ว มาหาตัวเลขตัวสุดท้ายกันดูครับ

import java.util.Scanner; //import util.scanner เพื่อใช้สำหรับรับค่า

public class IDPerson {
    public static void main(String[] args) {
        long id = 0;
        while(true){ //วนจนกว่าจะป้อนค่าที่ถูกต้อง
            try {
                Scanner in = new Scanner(System.in); //สร้างตัวแปร scanner เพื่อรับค่าทางแป้นพิมพ์
                System.out.print("กรุณากรอกรหัสประจำตัว 12 หลัก "); //แสดงให้ผู้กรอกรู้ว่าต้องกรอกตัวเลข
                id = in.nextLong(); //รับค่าจากแป้นพิมพ์เป็นชนิด long
                String checkbit = id + ""; //สร้างตัวแปร checkbit เป็นชนิดสตริงเพื่อตรวจสอบความยาวของตัวเลข
                if(checkbit.length() == 12) break; //check ว่าค่าที่รับเข้ามามีขนาดกี่หลัก ถ้ามีสิบสองหลักให้ break ออกจาก loop
            }catch (Exception e) {
            }
        }
        long base = 100000000000l; //สร้างตัวแปร เพื่อสำหรับให้หารเพื่อเอาหลักที่ต้องการ
        int basenow; //สร้างตัวแปรเพื่อเก็บค่าประจำหลัก
        int sum = 0; //สร้างตัวแปรเริ่มตัวผลบวกให้เท่ากับ 0
        for(int i = 13; i > 1; i--) { //วนรอบตั้งแต่ 13 ลงมาจนถึง 2
            basenow = (int)Math.floor(id/base); //หาค่าประจำตำแหน่งนั้น ๆ
            id = id - basenow*base; //ลดค่า id ลงทีละหลัก
            System.out.println(basenow + "x" + i + " = " + (basenow*i)); //แสดงค่าเมื่อคูณแล้วของแต่ละหลัก
            sum += basenow*i; //บวกค่า sum ไปเรื่อย ๆ ทีละหลัก
            base = base/10; //ตัดค่าที่ใช้สำหรับการหาเลขแต่ละหลัก
        }
        System.out.println("Sum is " + sum); //แสดงค่า sum
        int checkbit = (11 - (sum%11))%10; //คำนวณค่า checkbit
        System.out.println("Check bit is " + checkbit); //แสดงค่า checkbit ที่ได้
    }
}

เมื่อรันโดยใช้ค่า 381345983755 จะแสดงผลออกมาจะได้ดังนี้

กรุณากรอกรหัสประจำตัว 12 หลัก  381345983755
3x13 = 39
8x12 = 96
1x11 = 11
3x10 = 30
4x9 = 36
5x8 = 40
9x7 = 63
8x6 = 48
3x5 = 15
7x4 = 28
5x3 = 15
5x2 = 10
Sum is 431
Check bit is 9
comments