線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:11502
推到 Plurk!
推到 Facebook!

數字金額轉國字範例

 
a6475
高階會員


發表:67
回覆:230
積分:154
註冊:2002-09-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-28 12:53:47 IP:61.229.xxx.xxx 未訂閱
最近忽然需要用到此函數。 結果找來找去都找不到。 最後還是自已寫了一個簡單的函數 各位測試看看吧...     月夜 光明 藍更愁
------
月夜 光明 藍更愁
附加檔案:34738_TwnMoney.exe
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-28 16:39:07 IP:202.39.xxx.xxx 未訂閱
TNUM.ZIP 將一位數字轉換成一個國字數字的 Label 元件,如 0 轉成 BIG5 碼 "零" ( 附原始程式碼 ),作者 : 江謝迪。 http://vcl.vclxx.org/DELPHI/D32FREE/TNUM.ZIP CT970126.ZIP 提供 BIG5 碼中文數字與阿拉伯數字互換等多個中文環境適用的函 數單元及範例 ( 附原始程式碼 ),作者:錢達智。 http://vcl.vclxx.org/DELPHI/D32FREE/CT970126.ZIP --- --<-<-<@
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-29 11:58:38 IP:61.218.xxx.xxx 未訂閱
#include     #define TEN     "拾"
#define HND     "佰"
#define THU     "仟"
#define TTH     "萬"
#define HMI     "億"    #define FILL(A)         if(!zflag)                                 strcat(sResult, A);                         break
#define FILLW(A)        if(!zflag)                         {                                 tthflag = 1;                                 strcat(sResult, A);                         }                         break    #define FILLY(A)        if(!zflag)                         {                                 hmiflag = 1;                                 strcat(sResult, A);                         }                         break    void main(int argc, char **argv)
{
        if(argc < 2)
        {
                printf("Usage: %s amt\n", argv[0]);
                exit(0);
        }
        PrintBigMoney(argv[1]);            exit(0);
}    int PrintBigMoney(char *source)
{
        char    sResult[300], intpart[30], decpart[20], *pstr;
        char    *BigNum[] = {"零","壹","貳","參","肆","伍","陸","柒","捌","玖"};
        int     i, intlen, p_int = 0, zheadflag = 1, zflag = 0;
        int     tthflag = 0, hmiflag = 0;                                                                                                                                 memset(sResult, '\0', sizeof(sResult));
        strcpy(intpart, source);            if (intpart[p_int] == '-')
        {
                strcat(sResult, "負");
                p_int  ;
        }            pstr = (char *)strstr(intpart   p_int, ".");
        if (pstr != NULL)
        {
                pstr[0] = '\0';
                strcpy(decpart, pstr   1);
        }
        intlen = strlen(intpart);
        for(i = 0; i < intlen; i  )
        {
                if(intpart[i] < '0' || intpart[i] > '9')
                                                                               
                {
                        printf("part of int is not valid\n");
                        exit(0);
                }
        }
        for(i = 0; i < strlen(decpart); i  )
        {
                if(decpart[i] < '0' || decpart[i] > '9')
                {
                        printf("part of dec is not valid\n");
                        exit(0);
                }
        }
        if(intlen > 12)
                printf("Warning: number is too large to translate, result is possibly not accuracy!\n");
        if(atol(intpart) == 0)
                strcat(sResult, BigNum[0]);
        for (i = p_int; i < intlen; i  )
        {
                if (intpart[i] == '0')                                         
                {
                        if(zheadflag)
                                continue;
                        else
                                zflag = 1;
                }
                else
                {
                        zheadflag = 0;
                        if(zflag)
                        {
                                strcat(sResult, BigNum[0]);
                                zflag = 0;
                        }
                        strcat(sResult, BigNum[intpart[i] - '0']);
                }
                switch(intlen - i)
                {
                case 2:
                        FILL(TEN);
                case 6:
                                                                               
                        FILLW(TEN);
                case 10:
                        FILLY(TEN);
                case 14:
                        FILLW(TEN);
                case 18:
                        FILLY(TEN);
                case 3:
                        FILL(HND);
                case 7:
                        FILLW(HND);
                case 11:
                        FILLY(HND);
                case 15:
                        FILLW(HND);
                case 19:
                        FILLY(HND);
                case 4:
                        FILL(THU);
                case 8:
                        FILLW(THU);
                case 12:
                        FILLY(THU);
                case 16:
                        FILLW(THU);
                case 20:
                        FILLY(THU);
                case 5:
                case 13:
                        if(!zflag)
                                strcat(sResult, TTH);
                        else
                        {
                                if(tthflag)
                                        strcat(sResult, TTH);
                        }
                        break;
                case 9:
                        tthflag = 0;
                case 17:
                                strcat(sResult, HMI);
                        break;                                                 
                }
        }
        strcat(sResult, "元");
        if ((strlen(decpart) != 0) && (atol(decpart) != 0))
        {
                for (i = 0; i < strlen(decpart); i  )
                {
                        if (decpart[i] >= '0' && decpart[i] <= '9')
                                strcat(sResult, BigNum[decpart[i] - '0']);
                        if (i == 0)
                                strcat(sResult, "角");
                        if (i == 1)
                                strcat(sResult, "分");
                }
        }
        else
                strcat(sResult, "整");
        printf("%s\n", sResult);
}
HAVE A NICE DAY FOR YOU
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-31 21:11:53 IP:61.66.xxx.xxx 未訂閱
我提供另一種寫法給大家參考    請在此下宣告兩組常數 interface    uses Classes, StdCtrls, DB, SysUtils, Windows.... const CMoney: array[0..9] of string = ('零','壹','貳','參','肆','伍','陸','柒','捌','玖'); const CMoneyType: array [0..10] of string = ('','元','拾','佰','仟','萬','拾','佰','仟','億','拾'); 在 private 或 public 中宣告 function NTS(Value: string): string; 在實作中寫
Function NTS(Value: string): string;
         var tmplength: integer;
             tmpfare: string;
             i: integer;
             xmoney: array[0..9] of string;  // 決定金額的長度
             xmoney: array[0..9] of integer;  // 感謝marxtom 糾出
begin
     tmplength:= length(Value);
     tmpfare:= '';
     for i:=0 to 9 do xMoney[i]:= 0;
     for i:=0 to tmplength-1 do begin
         xMoney[i]:= StrtoIntDef(copy(Value,i 1,1),9);
         if xMoney[i] <> 0 then tmpfare:= tmpfare CMoney[xMoney[i]] 
                                          CMoneyType[tmplength-i];
         // 如果超過萬元而剛好萬元為0, 如 7506254
         // 上述功能會造成結果是 柒佰伍拾陸仟貳佰伍拾肆, 少掉萬字
         if (xMoney[i]=0) and (tmplength-i=5) then tmpfare:= tmpfare CMoneyType[tmplength-i];
     end;
     result:= trim(tmpfare);    end;
使用方式 Label1.Caption:= NTS('1234412'); 發表人 - P.D. 於 2003/08/01 22:49:56
marxtom
一般會員


發表:0
回覆:1
積分:0
註冊:2003-01-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-08-01 11:44:03 IP:61.64.xxx.xxx 未訂閱
[quote]              xmoney: array[0..9] of string;  // 決定金額的長度 感謝P.D.兄提供程式碼。但有一些小錯誤....    xmoney應設為integer的型態 xmoney: array[0..9] of integer;
fishstar
一般會員


發表:0
回覆:4
積分:0
註冊:2003-04-29

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-08-01 15:53:42 IP:210.66.xxx.xxx 未訂閱
我也來提供一種方式,看看大家覺得如何 //轉大寫副程式 Function ENum2CNum(ENum: integer): string; var wkNum1, wkNum2, wkNum3, wkUnit: string; i, j, wkLength: integer; wkZero: Boolean; begin wkZero := True; wkNum1 := IntToStr(ENum); wkLength := length(wkNum1); j := 1; for i := wkLength downto 1 do begin wkNUm2 := ''; wkUnit := ''; case StrToInt(wkNum1[i]) of 0 : begin if j = 5 then wkZero := True; if wkZero then wkNum2 := '' else wkNum2 := '零'; if wkLength = 1 then wkNum2 := '零'; end; 1 : wkNum2 := '壹'; 2 : wkNum2 := '貳'; 3 : wkNum2 := '參'; 4 : wkNum2 := '肆'; 5 : wkNum2 := '伍'; 6 : wkNum2 := '陸'; 7 : wkNum2 := '柒'; 8 : wkNum2 := '捌'; 9 : wkNum2 := '玖'; end; if StrToInt(wkNum1[i]) <> 0 then wkZero := False; if (StrToInt(wkNum1[i]) <> 0) OR (j = 5) then begin case j of 9 : wkUnit := '億'; 8 : wkUnit := '仟'; 7 : wkUnit := '佰'; 6 : wkUnit := '拾'; 5 : wkUnit := '萬'; 4 : wkUnit := '仟'; 3 : wkUnit := '佰'; 2 : wkUnit := '拾'; 1 : wkUnit := ''; end; end; wkNum3 := wkNum2 wkUnit wkNum3; j := j 1; end; Result := wkNum3 ; end;
chimera
初階會員


發表:62
回覆:78
積分:28
註冊:2003-03-22

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-08-01 17:02:00 IP:203.69.xxx.xxx 未訂閱
問一個無關程式的問題, 像3003000你們認為是三佰萬零三仟正確還是三佰萬三仟正確?? 我到銀行的討論區去問,結果他們的回答是兩者皆可, 但是我想要的最formal的答案,我想知道你們的看法。
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-08-01 22:41:14 IP:61.66.xxx.xxx 未訂閱
引言: 問一個無關程式的問題, 像3003000你們認為是三佰萬零三仟正確還是三佰萬三仟正確?? 我到銀行的討論區去問,結果他們的回答是兩者皆可, 但是我想要的最formal的答案,我想知道你們的看法。
其實這與學名及俗名一樣, 一般我們在說303萬, 口語化會說三佰零三萬這樣人家才聽得懂, 如果你告訴別人三佰三萬, 不覺得很奇怪嗎? 可是我們在寫金額時 大部份都會寫三佰三萬元, 因為如果你遇到這樣的數字30670405元, 如果按口語 翻譯的話, 那也很奇怪三仟零陸拾柒萬零肆佰零伍元, 很繞舌吧! 保證銀行會 @#$, 除非你的程式是這樣設計 仟 佰 萬 仟 佰 拾 元 就已經先印好的, 再用code填國字, 那你就真 的零的部份要填了 以上個人的經驗, 僅提供參考~~~~ 所以我提供的程式碼拿掉零的轉換 發表人 - P.D. 於 2003/08/02 11:32:03
lsu
一般會員


發表:1
回覆:14
積分:3
註冊:2003-03-11

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-08-04 23:15:50 IP:218.59.xxx.xxx 未訂閱
function TForm1.NumToWord(num:real):String; Var i,j:integer; ss,tt,h:string; z:boolean; Begin z:=false; j:=1; if Form1.ToolButton3.Down then tt:='[USD] ' else tt:='[CNY] '; ss:=Formatfloat('0.00',num); for i:=length(ss) downto 1 do begin h:=copy(ss,j,1); if h='.' then begin inc(j); continue; end; //跳过小数点 case strtoint(h) of 0: if z then begin //上一位已经是零 inc(j); if i=8 then begin tt:=copy(tt,0,length(tt)-2) '万零'; end ; if i=4 then begin tt:=copy(tt,0,length(tt)-2) '圆零'; end ; if i=1 then tt:=copy(tt,0,length(tt)-2) '整'; continue; end else begin z:=true; tt:=tt '零'; if i=4 then begin tt:=copy(tt,0,length(tt)-2) '圆零'; end; if i=1 then begin if ToolButton3.Down then tt:=copy(tt,0,length(tt)-2) '美分' else tt:=copy(tt,0,length(tt)-2); end; if i=8 then begin tt:=copy(tt,0,length(tt)-2) '万零'; end; inc(j); continue; end; 1: begin tt:=tt '壹'; z:=false; end; 2: begin tt:=tt '贰'; z:=false; end; 3: begin tt:=tt '叁'; z:=false; end; 4: begin tt:=tt '肆'; z:=false; end; 5: begin tt:=tt '伍'; z:=false; end; 6: begin tt:=tt '陆'; z:=false; end; 7: begin tt:=tt '柒'; z:=false; end; 8: begin tt:=tt '捌'; z:=false; end; 9: begin tt:=tt '玖'; z:=false; end; end; case i of 1: if ToolButton3.Down then tt:=tt '美分' else tt:=tt '分'; 2: if ToolButton3.Down then tt:=tt '拾' else tt:=tt '角'; 4: tt:=tt '圆'; 5: tt:=tt '拾'; 6: tt:=tt '佰'; 7: tt:=tt '仟'; 8: tt:=tt '万'; 9: tt:=tt '拾'; 10: tt:=tt '佰'; 11: tt:=tt '仟'; 12: tt:=tt '亿'; end; inc(j); end; result:=tt; end;
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2012-07-27 16:43:21 IP:59.120.xxx.xxx 未訂閱
雖然lag很久了,
但還是覺得這招很威,讚!

===================引 用 lsu 文 章===================
function TForm1.NumToWord(num:real):String; Var i,j:integer;
...43...
系統時間:2024-05-04 13:16:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!