ผู้เขียน หัวข้อ: โปรแกรมเช็คเลขปชช. 13 หลัก  (อ่าน 18848 ครั้ง)

0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้

ออฟไลน์ watson

  • Newbie
  • *
  • กระทู้: 14
  • Respect: 0
    • ดูรายละเอียด
โปรแกรมเช็คเลขปชช. 13 หลัก
« เมื่อ: พฤศจิกายน 06, 2006, 22:52:46 PM »
0
เรียนถามผู้รู้เรื่องการเขียนโปรแกรมเกี่ยวกับการตรวจสอบเลข 13 หลักว่าคีย์ถูกหรือผิด หรือมีหลักการแบบใดเหมือนของ hosxp ทำในเมนูห้องบัตร เมื่อมีการคีย์เลข 13 หลักจะมีการตรวจสอบก่อนทุกครั้งและแจ้งเมื่อคีย์ผิด
 

ออฟไลน์ pichailab

  • Newbie
  • *
  • กระทู้: 2
  • Respect: 0
    • ดูรายละเอียด
Re: โปรแกรมเช็คเลขปชช. 13 หลัก
« ตอบกลับ #1 เมื่อ: พฤศจิกายน 09, 2006, 16:29:59 PM »
0
ผมเจอใน web เลย copy มาให้ดู

ผมเข้าไปดูที่ http://www.siamdev.com/Board/question.asp?QID=344 เลยเกิดความคิดที่จะสร้างสูตรอาร์เรย์เพื่อตรวจสอบหมายเลขประชาชนครับ มาดู Algorithm ของการเช็ค Digit เลขบัตรประชาชนคนไทย ก่อน

3450200415698
เลข 8 คือ bit check ครับ
การคำนวนก็
3*13
4*12
5*11
0*10
2*9
0*8
0*7
4*6
1*5
5*4
6*3
9*2
นำผลลัพธ์มารวมกัน ครับ
ในที่นี้จะได้ 245
นำ 245 มา MOD ด้วย 11 จะได้ 3
นำ 11 ลบด้วย 3 จะได้ 8 พอดีครับ
ถ้าที่ได้ตรงกับ bit check ก็แสดงความหมายเลขบัตรนี้ถูกต้องครับ

ถ้าเราสร้างเป็นสูตร อาร์เรย์ จะต้องใช้ฟังก์ชัน VALUE MID ROW INDIRECT ครับ

ขั้นตอน
1 เราแยกตัวเลขออกโดยใช้ฟังก์ชัน MID
2 เมื่อแยกแล้วต้องแปลงตัวเลขที่แยกออกมาซึ่งเป็น Text ให้เป็นค่าจริงๆ ด้วยฟังก์ชัน VALUE
3 ทำการคูณตัวเลขที่แยกแต่ละตัวได้ด้วยเลขตำแหน่งซึ่งลดลงครั้งละ 1 ไปถึงหลักที่ 12 เช่น เริ่มตันหลักแรก คูณด้วย 13 หลักต่อไปคูณด้วย 12 หลักต่อไปคูณด้วย 11 เป็นต้น
4 รวมเลขผลคูณที่คำนวณได้
5 หาเศษของค่าที่คำนวณได้ในขั้นที่ 4 ด้วย 11
6 นำ 11 ลบผลลัพธ์ของ 5

ดังนั้นสูตรอารเรย์สุดท้ายคือ
Code:
{=11-MOD(SUM((VALUE(MID(CitizenID,ROW(INDIRECT("1:12")),1)))*(14-ROW(INDIRECT("1:12")))),11)}
 

ออฟไลน์ manoi

  • Hero Member
  • *****
  • กระทู้: 8,669
  • Respect: +170
    • ดูรายละเอียด
    • HOSxP Community Center
Re: โปรแกรมเช็คเลขปชช. 13 หลัก
« ตอบกลับ #2 เมื่อ: พฤศจิกายน 09, 2006, 21:22:32 PM »
0
code ภาษา Pascal ครับ

โค๊ด: Delphi
  1. function CheckPID(pid: string): boolean;
  2. var
  3.   i: integer;
  4.   nMod, nValue, cv: integer;
  5.   snmod: string;
  6. begin
  7.   pid := replacestr(pid, '-', '');
  8.   result := false;
  9.   if length(replacestr(pid, ' ', '')) <> 13 then
  10.     exit;
  11.  
  12.   try
  13.  
  14.     cv := strtoint(copy(pid, 1, 1));
  15.     nValue := cv * 13;
  16.  
  17.     for i := 2 to 12 do
  18.     begin
  19.       cv := strtoint(copy(pid, i, 1));
  20.       nValue := nValue + (cv * (14 - i));
  21.  
  22.     end;
  23.  
  24.     nMod := 11 - (nValue mod 11);
  25.     snmod := inttostr(nmod);
  26.     snmod := copy(snmod, length(snmod), 1);
  27.     result := copy(pid, 13, 1) = snmod;
  28.  
  29.   except
  30.     result := false;
  31.  
  32.   end;
  33.  
  34. end;
  35.  
  36.  
  37.  
HOSxP Project Manager / Cheif Developer / BMS MD