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

阿拉伯數字的轉換

 
懷舊的人
高階會員


發表:28
回覆:152
積分:141
註冊:2003-01-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-23 15:54:38 IP:211.78.xxx.xxx 未訂閱
請教各位: 一般都是將阿拉伯數字轉為大寫數字,如果反過來要將大寫數字轉為阿拉伯數字要如何進行? 謝謝各位
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-23 16:37:29 IP:218.15.xxx.xxx 未訂閱
懷舊的人您好: 参考: 數字金額轉國字範例  http://delphi.ktop.com.tw/topic.php?topic_id=34738 里有 hagar前辈提供的链接 CT970126.ZIP 提供 BIG5 碼中文數字與阿拉伯數字互換等多個中文環境適用的函 數單元及範例 ( 附原始程式碼 ),作者:錢達智。 http://vcl.vclxx.org/DELPHI/D32FREE/CT970126.ZIP ps上来,您试试看 < class="code"> (* -------------------------------------------------- *) (* BCNum2Num 将中文<<大写>>数字字串转成阿拉伯数字 (* 使用示例: (* if BCNum2Num('壹仟参佰万零肆拾点壹零参', dblTest) (* dblTest ==> 13000040.103 (* (* 注意事项: (* 1. 转换成功, 函数传回 True; 否则为 False (* 2. 不支援 '肆万万' 等的说法, 必须为标准的记数方式 (* (* Author: Wolfgang Chien (* Date: 1996/08/04 (* Update Date: (* -------------------------------------------------- *) function BCNum2Num(sChineseNum: string; var dblArabic: double): boolean; const _ChineseNumeric = '拾佰仟万亿兆点零壹贰参肆伍陆柒捌玖'; var i: integer; iPos: integer; dblBuffer: double; sMultiChar: string; iDigit: integer; iRightOfDecimal: integer; bMinus: boolean; (* 简单的十次方函数, 取 10^n, where n: byte and n >= 0 *) function EasyPower10(iPower: byte): double; var i: integer; begin Result := 1; try for i := 1 to iPower do Result := Result * 10; except Result := 0; end; end; begin Result := False; dblArabic := 0; dblBuffer := 0; iDigit := -1; iRightOfDecimal := -1; if Copy(sChineseNum, 1, 2) = '负' then begin sChineseNum := Copy(sChineseNum, 3, 254); bMinus := True; end else bMinus := False; i := 1; while i < Length(sChineseNum) do begin (* 如果不是中文字 ==> Fail *) if sChineseNum[i] < #127 then Exit; sMultiChar := Copy(sChineseNum, i, 2); iPos := Pos(sMultiChar, _ChineseNumeric); if iPos = 0 then Exit; if (iDigit = -1) and (iPos > 13) then iDigit := (iPos - 15) div 2; case iPos of 1, 3, 5: begin (* 拾佰仟 *) if iDigit = -1 then iDigit := 1; dblBuffer := dblBuffer iDigit * EasyPower10((iPos 1) div 2); iDigit := -1; end; 7, 9, 11: begin (* 万亿兆 *) if (iDigit > 0) and (iDigit < 10) then dblBuffer := dblBuffer iDigit; dblArabic := dblArabic dblBuffer * EasyPower10((iPos-5) div 2 * 4); iDigit := -1; dblBuffer := 0; end; 13: begin (* 小数点 *) if (iDigit > 0) and (iDigit < 10) then dblBuffer := dblBuffer iDigit; dblArabic := dblArabic dblBuffer; dblBuffer := 0; iDigit := -1; iRightOfDecimal := 0; end; 15: (* 零 *) begin if iRightOfDecimal > -1 then Inc(iRightOfDecimal); iDigit := -1; end; else begin if iRightOfDecimal > -1 then begin (* 小数点右边的部分 *) Inc(iRightOfDecimal); try dblArabic := dblArabic iDigit / EasyPower10(iRightOfDecimal); except Exit; end; iDigit := -1; end; end; end; {$ifdef __Debug} ShowMessage(IntToStr(i) 'th dblArabic: ' FloatToStr(dblArabic)); ShowMessage(IntToStr(i) 'th dblBuffer: ' FloatToStr(dblBuffer)); ShowMessage(IntToStr(i) 'th iDigit: ' IntToStr(iDigit)); {$endif} Inc(i, 2); end; if (iDigit > 0) and (iDigit < 10) then dblBuffer := dblBuffer iDigit; if dblBuffer <> 0 then dblArabic := dblArabic dblBuffer; if bMinus then begin {$ifdef __SafeMode} sChineseNum := '负' sChineseNum; {$endif} dblArabic := dblArabic * -1; end; {$ifdef __SafeMode} Result := sChineseNum = Num2BCNum(dblArabic); {$else} Result := True; {$endif} end; 使用: procedure TForm1.Button1Click(Sender: TObject); var dblTest:double; begin if BCNum2Num('壹仟参佰万零肆拾点壹零参', dblTest) then showmessage(currtostr(dbltest)); end; 具体可自己下载档案来查看 ~~~行径窄处,留一步与人行~~~ 發表人 - deity 於 2004/12/23 16:42:06
懷舊的人
高階會員


發表:28
回覆:152
積分:141
註冊:2003-01-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-23 17:03:45 IP:211.78.xxx.xxx 未訂閱
我已經下載試過了 謝謝
系統時間:2024-05-22 10:44:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!