VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

公司統編8碼的判斷

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
CPS0204



註冊時間: 2014-08-24
文章: 441


第 1 樓

發表發表於: 星期二 一月 26, 2021 2:14 pm    文章主題: 公司統編8碼的判斷 引言回覆

無意中看到此php程式,大家可改良他
第7碼為7時,好像需重判斷!


<script>
//供驗證公司統編正確
function ValidateTaxID(sTaxID)
{
try
{
var i;
var a1;
var a2;
var a3;
var a4;
var a5;

var b1;
var b2;
var b3;
var b4;
var b5;

var c1;
var c2;
var c3;
var c4;

var d1;
var d2;
var d3;
var d4;
var d5;
var d6;
var d7;
var cd8;

if(sTaxID.length != 數字八) return false;

var c;
for (i = 0; i < 8; i++)
{
c = sTaxID.charAt(i);
if ("0123456789".indexOf(c) == -1) return false;
}

d1 = parseInt(sTaxID.charAt(0));
d2 = parseInt(sTaxID.charAt(1));
d3 = parseInt(sTaxID.charAt(2));
d4 = parseInt(sTaxID.charAt(3));
d5 = parseInt(sTaxID.charAt(4));
d6 = parseInt(sTaxID.charAt(5));
d7 = parseInt(sTaxID.charAt(6));
cd8 = parseInt(sTaxID.charAt(7));

c1 = d1;
c2 = d3;
c3 = d5;
c4 = cd8;

a1 = parseInt((d2 * 2) / 10);
b1 = (d2 * 2) % 10;

a2 = parseInt((d4 * 2) / 10);
b2 = (d4 * 2) % 10;

a3 = parseInt((d6 * 2) / 10);
b3 = (d6 * 2) % 10;

a4 = parseInt((d7 * 4) / 10);
b4 = (d7 * 4) % 10;

a5 = parseInt((a4 + b4) / 10);
b5 = (a4 + b4) % 10;

if((a1 + b1 + c1 + a2 + b2 + c2 + a3 + b3 + c3 + a4 + b4 + c4) % 10 == 0) return true;

if(d7 = 7)
{
if((a1 + b1 + c1 + a2 + b2 + c2 + a3 + b3 + c3 + a5 + c4) % 10 == 0) return true;
}

return false;
}catch(e){
return false;
}
}
</script>
回頂端
檢視會員個人資料 發送私人訊息
syntech



註冊時間: 2003-05-16
文章: 4211
來自: Taipei,Taiwan

第 2 樓

發表發表於: 星期二 一月 26, 2021 3:04 pm    文章主題: 引言回覆

這要需另外開版嗎?
_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
garfield
Site Admin


註冊時間: 2003-01-30
文章: 2157


第 3 樓

發表發表於: 星期二 一月 26, 2021 5:32 pm    文章主題: 引言回覆

(統編驗證 中文補充)
假設統一編號為 A B C D E F G H
A — G 為編號, H 為檢查碼
A — G 個別乘上特定倍數, 若乘出來的值為二位數則將十位數和個位數相加
A x 1
B x 2
C x 1
D x 2
E x 1
F x 2
G x 4
H x 1
最後將所有數值加總, 被 10 整除就為正確
若上述演算不正確並且 G 為 7 得話, 再加上 1 被 10 整除也為正確

_________________
利用>>搜尋<<的功能會比問的還要快得到答案.
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
朱育興



註冊時間: 2003-08-25
文章: 661
來自: 台中市大里區

第 4 樓

發表發表於: 星期五 三月 26, 2021 3:06 pm    文章主題: 引言回覆

代碼:
* ---------------- *
* 統一編號驗證函數 *
* ---------------- *
FUNCTION CHECK_UNIFORM_NO
* -------------------------------------------------------------------------- *
* 建立日期:2021/03/26
* 修改日期:2021/03/26
* 編碼者:朱育興 YSC5096
* 註:版權沒有;歡迎拷貝使用
* -------------------------------------------------------------------------- *
* 統一編號 (Uniform numbers) 檢核原則:
*   (1)碼號內容說明
*      第 1 ~ 7 碼:流水號
*      第 8 碼:檢查碼
*   (2)檢查號碼計算規則
*      第 1 ~ 7 碼:
*        每一碼個別乘上特定倍數,若乘出來的值為二位數則將十位數和個位數相ㄐㄧㄚ
*        +------+---+---+---+---+---+---+---+---+
*        | 碼號 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
*        +------+---+---+---+---+---+---+---+---+
*        | 乘數 | 1 | 2 | 1 | 2 | 1 | 2 | 4 | 1 |
*        +------+---+---+---+---+---+---+---+---+
*      第 8 碼:檢查碼
*        1.將第 1 ~ 8 碼依上述規則ㄐㄧㄚ總,被 10 整除就為正確
*        2.若上述演算不正確並且第 7 碼為 7 的話,再ㄐㄧㄚ上 1 被 10 整除ㄧㄝˇ為正確
*   (3)範例說明
*      統一編號 = 22922015 (5為正確之檢查碼)
*         2  2  9  2  2  0  1
*      ×  1  2  1  2  1  2  4      (乘數)
*      ------------------------------------
*         2  4  9  4  2  0  4
*
*         2+4+9+4+2+0+4 = 25
*         檢查碼 = 10 - 5 = 5

*      統一編號 = 22922079 (9 為正確之檢查碼)
*                 22922078 (8 ㄧㄝˇ是正確之檢查碼)
*         2  2  9  2  2  0  7
*      ×  1  2  1  2  1  2  4      (乘數)
*      ------------------------------------
*         2  4  9  4  2  0 28
*
*         2+4+9+4+2+0+(2+8) = 31
*         1.檢查碼 = 10-1 = 9
*         2.ㄧㄣ為第 7 碼是 7,所以檢查碼 = 10 - (1+1) = 8 ㄧㄝˇ是正確的
* -------------------------------------------------------------------------- *
* --------------------------------------------------------------------------
* 參數               型態 說明
* ------------------ ---- --------------------------------------------------
* Input:
*   LP_cUniformNO    C    要驗證的統一編號
*   (LP_lNoShowMess) L    1.(可選參數)是否不要顯示錯誤內容
*                         2.預ㄕㄜˋ值 = .F. (代表要顯示錯誤內容)
*   (LP_lPassMess)   L    1.(可選參數)驗證失敗時,是否回傳錯誤內容
*                         2.預ㄕㄜˋ值 = .F. (代表要回傳錯誤內容)
*                         3.當本參數 = .T. 時,LP_lNoShowMess 會強迫等於 .T.
* Output:
*     Wo_lCHKOK      L    是否驗證通過。回傳 .T. 或 .F.
*  或 Wo_cMess       C    錯誤內容
* --------------------------------------------------------------------------
LPARAMETERS LP_cUniformNO, LP_lNoShowMess, LP_lPassMess

LOCAL Wo_lCHKOK, Wo_cMess

Wo_lCHKOK = .T.
Wo_cMess  = ""

* -------- *
* 參數檢查 *
* -------- *
IF TYPE("LP_lNoShowMess") <> "L"
  LP_lNoShowMess = .F.
ENDIF
IF TYPE("LP_lPassMess") <> "L"
  LP_lPassMess   = .F.
ENDIF
* > 當驗證失敗時、選擇要回傳錯誤內容時,強制不呼叫 [訊息方塊]
IF LP_lPassMess = .T.
  LP_lNoShowMess = .T.
ENDIF

* ------------ *
* 區域變數宣告 *
* ------------ *
LOCAL W1_cUniformNO,;           && C 統一編號
      W1_nSUB_A,;               && N FOR ... ENDFOR 迴圈駐標
      W1_nSUM,;                 && N ㄐㄧㄚ總
      W1_nNumericalValue,;      && N 計算數值
      W1_nINT,;                 && N INT 函數計算值
      W1_nMOD                   && N MOD 函數計算值

LOCAL ARRAY W1_aUniformNO[8],;  && A 將 8 位的統一編號拆到 8 個ㄓㄣˋ列元素中
            W1_aFactor[8]       && A 用來驗證統一編號的乘數ㄧㄣ子

W1_cUniformNO  = ALLTRIM(LP_cUniformNO)

* -------------- *
* 將統一編號拆解 *
* -------------- *
STORE SPACE(01) TO W1_aUniformNO
FOR W1_nSUB_A = 1 TO ALEN(W1_aUniformNO, 1)
  W1_aUniformNO[W1_nSUB_A] = SUBSTR(W1_cUniformNO, W1_nSUB_A, 1)
ENDFOR

DO CASE
CASE EMPTY(W1_cUniformNO)
     * 不驗證
     RETURN Wo_lCHKOK
CASE LEN(W1_cUniformNO) <> 8
     Wo_cMess = "統一編號的長度應為 8 個數字"
OTHERWISE
     FOR W1_nSUB_A = 1 TO ALEN(W1_aUniformNO, 1)
       IF !ISDIGIT(W1_aUniformNO[W1_nSUB_A])
         Wo_cMess = "統一編號必須是阿拉伯數字"
         EXIT
       ENDIF
     ENDFOR
ENDCASE

* ---- *
* 驗證 *
* ---- *
IF EMPTY(Wo_cMess)
  * > 乘數ㄧㄣ子
  W1_aFactor[1] = 1
  W1_aFactor[2] = 2
  W1_aFactor[3] = 1
  W1_aFactor[4] = 2
  W1_aFactor[5] = 1
  W1_aFactor[6] = 2
  W1_aFactor[7] = 4
  W1_aFactor[8] = 1

  * > ㄐㄧㄚ總
  W1_nSUM   = 0
  FOR W1_nSUB_A = 1 TO ALEN(W1_aUniformNO, 1)
    W1_nNumericalValue = VAL(W1_aUniformNO[W1_nSUB_A]) * W1_aFactor[W1_nSUB_A]
    W1_nINT = INT(W1_nNumericalValue / 10)
    W1_nMOD = MOD(W1_nNumericalValue, 10)
    W1_nSUM = W1_nSUM + W1_nINT + W1_nMOD
  ENDFOR
  * > 驗證
  DO CASE
  CASE W1_aUniformNO[7] == "7"
       IF !INLIST(MOD(W1_nSUM, 10), 0, 9)
         Wo_cMess = "統一編號檢查號碼不合"
       ENDIF
  OTHERWISE
       IF MOD(W1_nSUM, 10) != 0
         Wo_cMess = "統一編號檢查號碼不合"
       ENDIF
  ENDCASE
ENDIF

* ---- *
* 回傳 *
* ---- *
IF !EMPTY(Wo_cMess)
  IF LP_lNoShowMess = .T.
    Wo_lCHKOK   = .F.
  ELSE
    IF MESSAGEBOX(Wo_cMess+CHR(13)+CHR(10)+CHR(13)+CHR(10)+"是否強迫輸入?", 4+32+256, PADR("統一編號驗證", 40)) <> 6   && 不是 Yes
      Wo_lCHKOK = .F.
    ENDIF
  ENDIF

  IF LP_lPassMess = .T.
  IF Wo_lCHKOK = .F.
    RETURN Wo_cMess
  ENDIF
  ENDIF
ENDIF
RETURN Wo_lCHKOK
ENDFUNC

_________________
希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 MSN Messenger
lygcw9603



註冊時間: 2011-12-25
文章: 126


第 5 樓

發表發表於: 星期日 三月 28, 2021 2:56 pm    文章主題: 引言回覆

只要有規則,就不叫問題
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作