有兄弟提供下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 调用就可以 谢谢!!
我现在 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 调用就可以 谢谢!!
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;interfaceuses SysUtils,Windows;var
ls:variant; function crashrmb(ls: Variant): string; //1.定义函数num_str
implementationfunction 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.
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)]调用