Validate Thai National ID
validate_thai_id · validity · text, number
2026-09-23
กำลังประมวลผล…
validate_thai_id · validity · text, number
2026-09-23
เลขบัตรประชาชนไทยมีหลักตรวจสอบอยู่ในตัว หลักที่ 13 คำนวณจากสิบสองหลักแรก การพิมพ์ผิดเพียงตัวเดียวจึงตรวจจับได้ทันทีโดยไม่ต้องเชื่อมต่อระบบใด เทคนิคนี้ตรวจ checksum และจัดรูปแบบให้เป็นแบบเดียวกันทั้งคอลัมน์
(11 - ผลรวม mod 11) mod 10 ต้องเท่ากับหลักที่ 13format เลือกได้ว่าจะเก็บเป็นเลขล้วนหรือแบบ 1-2345-67890-12-3 และค่าที่ไม่ผ่านจะไม่ถูกจัดรูปแบบผลลัพธ์นี้ถือเป็นข้อมูลส่วนบุคคล ควรใช้
mask_piiก่อนแบ่งปันไฟล์ให้ผู้อื่นเสมอ
| Parameter | Type | Default |
|---|---|---|
column | string | — |
action | flag | null | remove_row | "flag" |
newColumnName | string | — |
format | digits | dashed | "digits" |
import json
import re
def is_valid_thai_id(digits):
if not re.fullmatch(r'\d{13}', digits):
return False
total = sum(int(digits[i]) * (13 - i) for i in range(12))
return (11 - total % 11) % 10 == int(digits[12])
def validate_thai_id(value, fmt='digits'):
if value is None:
return {'value': None, 'valid': None}
digits = re.sub(r'[\s -]', '', str(value))
if not is_valid_thai_id(digits):
return {'value': value, 'valid': False}
if fmt == 'dashed':
groups = [digits[0:1], digits[1:5], digits[5:10], digits[10:12], digits[12:]]
return {'value': '-'.join(groups), 'valid': True}
return {'value': digits, 'valid': True}
values = ['1-1007-01546-23-6', '3209900123452', '1100701546235', 'ไม่ใช่เลขบัตร', None]
print(json.dumps([validate_thai_id(v) for v in values], ensure_ascii=False))
ไฟล์ลงทะเบียน 3,000 แถวมีคอลัมน์ national_id ที่กรอกด้วยมือ รัน validate_thai_id แบบ flag แล้วกรองดูเฉพาะแถวที่ไม่ผ่านด้วย filter_rows ส่งรายการนั้นกลับไปให้ทีมที่ดูแลข้อมูลแก้ที่ต้นทาง ก่อนส่งไฟล์ต่อให้ทีมอื่น ให้ปิดบังคอลัมน์นี้ด้วย mask_pii
ใช้ pad_or_strip_zeros เมื่อเลขถูกเปิดด้วย Excel จนศูนย์นำหน้าหาย ใช้ validate_regex สำหรับรูปแบบเลขประจำตัวแบบอื่น และใช้ mask_pii ก่อนแบ่งปันไฟล์เสมอ