身份證統一編號共計有 10 位,其中第一位為英文字母,後共有九個數字;
而最後一位數字為檢查碼( Check Digit ) ,表示如下表:
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
│L1│D1│D2│D3│D4│D5│D6│D7│D8│D9│
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
  ↑  ↑                              ↑
  │  └──ゝ 1:表示男性            └─ ゞ檢查號碼
  │           2:表示女性
  │
  └ヾ英文字母:代表各縣市

┌─────┐
│其關係如下│
└─────┘
ヾ:字母 L1 對照表如下,須找出其代號 2 位:
   ┌──┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ ︵
   │字母│A│B│C│D│E│F│G│H│J│K│L│M│N│ 注
   ├──┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ 意
   │代號│10│11│12│13│14│15│16│17│18│19│20│21│22│ 代
   └──┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ 表
   ┌──┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ 號
   │字母│P│Q│R│S│T│U│V│X│Y│W│Z│I│O│ 順
   ├──┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ 序
   │代號│23│24│25│26│27│28│29│30│31│32│33│34│35│ !!
   └──┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ ︶

  各英文字母之加權數,及代表縣市如下:
  A = 10台北市 B = 11台中市 C = 12基隆市 D = 13台南市
  E = 14高雄市 F = 15台北縣 G = 16宜蘭縣 H = 17桃園縣
  I = 34嘉義市 J = 18新竹縣 K = 19苗壢縣 L = 20台中縣
  M = 21南投縣 N = 22彰化縣 O = 35新竹市 P = 23雲林縣
  Q = 24嘉義縣 R = 25台南縣 S = 26高雄縣 T = 27屏東縣
  U = 28花蓮縣 V = 29台東縣 W = 32金門縣 X = 30澎湖縣
  Y = 31陽明山 Z = 33連江縣

  檢查碼的求法:
  令其十位數為 X1 ,個位數為 X2 ;( 如A:X1=1 , X2=0 )

  :依其公式計算結果:
    Y= X1 + 9*X2 + 8*D1 + 7*D2 + 6*D3 + 5*D4 + 4*D5 + 3*D6 + 2*D7
        + D8 + D9

  :假如Y能被 10 整除,則表示該身份證號碼為正確,否則為錯誤。即如
    以 10 為模數,檢查號碼為 ( 10 - Y - D9 ) / 10 的餘數,如餘數
    為 0 時,則檢查碼為 0 。

//------------------------------------------------------------------
// 檢驗身分證號碼的正確性
//------------------------------------------------------------------
function CheckIdNo(ID: string): boolean;
const
  LetterWeight: array['A'..'Z'] of integer =
//    A   B   C   D   E   F   G   H   I   J   K   L   M   N   O
    (10, 11, 12, 13, 14, 15, 16, 17, 34, 18, 19, 20, 21, 22, 35,
     23, 24, 25, 26, 27, 28, 29, 32, 30, 31, 33);
//    P   Q   R   S   T   U   V   W   X   Y   Z
var
  i: integer;
  D: array[1..9] of integer;
  Sum: integer;
begin
  Result := false;
  if Length(ID) <> 10 then
    Exit;
  ID := UpperCase(ID);
  if not (ID[1] in ['A'..'Z']) then
    Exit;
  for i := 2 to 10 do
  begin
    if not (ID[i] in ['0'..'9']) then
      Exit;
  end;

  for i := 1 to 9 do
    D[i] := StrToInt(Copy(ID, i+1, 1));

  i := LetterWeight[ID[1]];
  Sum := (i div 10) + (i mod 10) * 9;
  Sum := Sum + 8 * D[1] + 7 * D[2] + 6 * D[3] + 5 * D[4]
          + 4 * D[5] + 3 * D[6] + 2 * D[7] + D[8] + D[9];
  Result := (Sum mod 10 = 0);
end;

    Source: geocities.com/huanlin_tsai/faq

               ( geocities.com/huanlin_tsai)