有兄弟提供下delphi撰寫好的函式 我在FASTREPORT 可以直接呼叫
我現在 CONVERT 是轉換大寫的函式 所有都是到元角分,但是現在不想要
var AStr:WideString; //中文要用寬字符
yPos,i:integer;
begin
try
AStr:=Convert(StrToFloat(formatfloat('0.00',<frxDBDataset1."shkje">)));
for i:=1 to length(formatfloat('0.00',<frxDBDataset1."shkje">)) do begin //取得非零的位置
if strtofloat(copy(formatfloat('0.00',<frxDBDataset1."shkje">),i,length(formatfloat('0.00',<frxDBDataset1."shkje">))-i+1))=0 then break;
end;
case length(formatfloat('0.00',<frxDBDataset1."shkje">))+1-i of
0,1,2:daxiejine.memo.add(AStr);
3:daxiejine.memo.add(copy(AStr,1,(i-1)*2)+'整');
4,5,6,7:daxiejine.memo.add(copy(AStr,1,(i-1)*2)+'元整');
8,9,10:daxiejine.memo.add(copy(AStr,1,(i-1)*2)+'萬元整');
11:daxiejine.memo.add(copy(AStr,1,(i-1)*2)+'元整');
12,13,14,15:daxiejine.memo.add(copy(AStr,1,(i-1)*2)+'億元整');
end;
except
ShowMessage('無效的資料!請重試');
end;
在FASTREPORT WIDESTRING不能通過
我對大寫的要求是 后面有小數 就顯示元角分,沒有就直接現在是多少元整!
望哪位兄直接給我段DELPIHI 函式 在FASTreport 呼叫就可以 謝謝!!
uj5u.com熱心網友回復:
也是網上下的一起在用。。。
{
Calendar Unit for Borland Delphi 5 (Other Version is not tested)
Translated By Liu Ru Xu ([email protected])
2001-1-4
}
{
Announcement from the original author:
***************************************************************************
致看到這些源代碼的兄弟:
你好!
這本來是我為一個商業PDA產品開發的日歷程式,最近移植于PC機上, 所以演算法
和資料部分是用純C++寫的,不涉及MFC,所有的代碼都是以短節省存盤空間為主要目
的.
很高興你對這些代碼有興趣,你可以隨意復制和使用些代碼,唯一有一點小小的
愿望:在你使用和復制給別人時,別忘注明這些代碼作者:-)。程式代碼也就罷了,后
面的資料可是我辛辛苦苦從萬年歷上找出來輸進去的。
如果你有什么好的意見不妨Mail給我。
[email protected]
或
[email protected]
2000年3月
****************************************************************************
}
unit crash_rmb;
interface
uses SysUtils,Windows;
var
ls:variant;
function crashrmb(ls: Variant): string; //1.定義函式num_str
implementation
function crashrmb(ls: Variant): string; //1.定義函式num_str
var
dx_sz, dx_dw, str_int, str_dec, dx_str, fu: string;
a, b, b2, c, d: string;
num_int, num_dec, len_int, i, a_int, pp: integer;
//dx_str為回傳字串
begin
dx_sz := '零壹貳叁肆伍陸柒捌玖';
dx_dw := '萬仟佰拾億仟佰拾萬仟佰拾元';
//處理金額小于零情況
if ls < 0 then
begin
ls := ls*(-1);
fu := '負';
end else fu := '';
//取得整數值及整數串
dx_str := ls;
if (ls > 0) and (ls < 1) then dx_str := '0' + dx_str;
pp := pos('.', dx_str);
if pp > 0 then str_int := copy(dx_str, 1, pos('.', dx_str)-1)
else str_int := dx_str;
num_int := strtoint(str_int);
//取得小數值及小數串
if (ls > 0) and (ls < 1) then num_dec := ls*100
else num_dec := (ls-num_int)*100;
str_dec := inttostr(num_dec);
len_int := Length(str_int);
dx_str := '';
//轉換整數部分
for i := 1 to len_int do
begin
//a為小寫數字字符,b為對應的大寫字符
//c為對應大寫單位,d為當前大寫字串的最后一個漢字
a := copy(str_int, i, 1);
a_int := strtoint(a);
b := copy(dx_sz, (a_int * 2 + 1), 2);
c := copy(dx_dw, ((13 -len_int + i-1)* 2 + 1), 2);
if dx_str <> '' then
d := copy(dx_str, Length(dx_str)-1, 2)
else d := '';
if (b = '零') and ((d = '零') or (b = b2) or (c = '元') or (c = '萬') or (c = '億')) then b := '';
if (a = '0') and (c <> '元') and (c <> '萬') and (c <> '億') then c := '';
if ((c = '元') or (c = '萬') or (c = '億')) and (d = '零') and (a = '0') then
begin
dx_str := copy(dx_str, 1, Length(dx_str)-2);
d := copy(dx_str, Length(dx_str)-1, 2);
if ((c = '元') and (d = '萬')) or ((c = '萬') and (d = '億')) then c := '';
end;
dx_str := dx_str + b + c; b2 := b;
end;
//處理金額小于1的情況
if Length(dx_str) <= 2 then dx_str := '';
//轉換小數部分
if (num_dec < 10) and (ls > 0) then
begin
a_int := strtoint(str_dec);
b := copy(dx_sz, (a_int*2 + 1), 2);
if num_dec = 0 then dx_str := dx_str + '整';
if num_dec > 0 then dx_str := dx_str + '零' + b + '分';
end;
if num_dec >= 10 then
begin
a_int := strtoint(copy(str_dec, 1, 1));
a := copy(dx_sz, (a_int*2 + 1), 2);
a_int := strtoint(copy(str_dec, 2, 1));
b := copy(dx_sz, (a_int*2 + 1), 2);
if a <> '零' then a := a + '角';
if b <> '零' then b := b + '分'
else b := '';
dx_str := dx_str + a + b;
end;
if ls = 0 then dx_str := '零元整';
dx_str := fu + dx_str;
//函式回傳字串
Result := dx_str;
end;
{ 2.呼叫方法
函式引數采用Variant型別,呼叫時引數值可以是實型,也可以是字串,非常方便,下面舉
例說明:
新建視窗,在相應pas檔案中加入num_str函式,并在視窗中添加Button1和Edit1、Edit2控制元件,雙擊Button1輸入以下代碼,運行程式即可:
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.text:=num_str(202055010.32);
//也可以在Edit2中輸入數串呼叫
//Edit1.text:=num_str(Edit2.text);
end;
}
end.
uj5u.com熱心網友回復:
function CN_rmb_nl(Num: string): WideString;
const
cNum:WideString='零壹貳叁肆伍陸柒捌玖-萬仟佰拾億仟佰拾萬仟佰拾元角分';
cCha:array[0..1,0..11]of string=
(('零仟','零佰','零拾','零零零','零零','零億','零萬','零元','億萬','零角','零分','零整'),
('零','零','零','零','零','億','萬','元','億','零','整','整'));
var
i:Integer;
S,sNum:WideString;
nNum:Real;
begin
if Num='' then
begin
Result:=' ';
exit;
end;
if Num='0' then
begin
Result:='人民幣零元(¥0.00)';
exit;
end;
try
nNum:=StrToFloat(Num);
sNum:=FormatFloat('0',nNum*100);
for i:=1 to Length(sNum) do
S:=S+ cNum[ord(sNum[i])-47]+cNum[26-Length(sNum)+i];
for i:= 0 to 11 do //去掉多余的零
S:=StringReplace(S,cCha[0,i],cCha[1,i],[rfReplaceAll]);
S:='人民幣'+S;
Result:=S;
except
Result:=' ';
end;
end;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
procedure TDM.DataModuleCreate(Sender: TObject); //需在UserFunction處定義函式
begin
frxReport_1.AddFunction('function CN_rmb_nl(Num:string):WideString;','Myfunction1','人民幣中文大寫轉換(不帶小寫)');
end;
然后便可直接在報表中[cn_rmb_nl(11)]呼叫
uj5u.com熱心網友回復:
http://www.tansoo.cn/default.asp?tag=%E5%A4%A7%E5%86%99%E9%87%91%E9%A2%9Duj5u.com熱心網友回復:
好長的代碼orz。。還是finereport無編程量比較適合我用,哈哈。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/86071.html
標籤:VCL組件開發及應用
