BMS-HOSxP Community

HOSxP => แจ้งปัญหา / ขอความช่วยเหลือ => ข้อความที่เริ่มโดย: watson ที่ พฤศจิกายน 06, 2006, 22:52:46 PM

หัวข้อ: โปรแกรมเช็คเลขปชช. 13 หลัก
เริ่มหัวข้อโดย: watson ที่ พฤศจิกายน 06, 2006, 22:52:46 PM
เรียนถามผู้รู้เรื่องการเขียนโปรแกรมเกี่ยวกับการตรวจสอบเลข 13 หลักว่าคีย์ถูกหรือผิด หรือมีหลักการแบบใดเหมือนของ hosxp ทำในเมนูห้องบัตร เมื่อมีการคีย์เลข 13 หลักจะมีการตรวจสอบก่อนทุกครั้งและแจ้งเมื่อคีย์ผิด
หัวข้อ: Re: โปรแกรมเช็คเลขปชช. 13 หลัก
เริ่มหัวข้อโดย: pichailab ที่ พฤศจิกายน 09, 2006, 16:29:59 PM
ผมเจอใน 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)}
หัวข้อ: Re: โปรแกรมเช็คเลขปชช. 13 หลัก
เริ่มหัวข้อโดย: manoi ที่ พฤศจิกายน 09, 2006, 21:22:32 PM
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.