货币转换(100分)

  • 主题发起人 主题发起人 tian116
  • 开始时间 开始时间
T

tian116

Unregistered / Unconfirmed
GUEST, unregistred user!
[blue]各位富翁:
小弟急需一个货币大小写转换的小程序!小弟在此先向你们致谢![:)]
[/blue]
 
用Delphi编制金额大写转换程序
(作者:杨波 2000年04月20日 14:04)

  在从事与财务相关的软件开发过程中,通常要求将小写金额转换成相应的大写金额,并打印在大写金额栏中。下面是用Delphi3.0编制的一个转换函数,能够方便的在程序中调用,并返回字符串。
  1.定义函数num—str
  function num—str(ls: Variant): String;

  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—intdo

   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;



fpsky (2002-02-28 13:29:00)
这样更好:
function FourNumToChnNum(Str:string;ChnNum:string;var Pre:boolean):string;
const
ChnNum2='零壹贰叁肆伍陆柒捌玖';
var
i,j,Len:integer;
begin

Result := '';
Len := Length(str) ;
for i:=1 to Lendo
begin

j := Ord(str)-48;
if j=0 then

Pre := True
else
begin

if Pre then

Result := Result + '零';
Result := Result + Copy(ChnNum2,j*2+1,2) + Trim(Copy(ChnNum,(Len - i) * 2+1,2));
Pre := False;
end;

end;

end;

function StringToChnNum(str:string):string;
const
ChnNum1='圆万亿兆';
var
i,Len,Len1,Level,Start:integer;
s1,s:string;
Pre: Boolean;
begin

Result := '';
Len := Pos('.',str)-1;
Level := (Len + 3) div 4 ;
Len1 := Len mod 4 ;
if Len1=0 then

Len1 := 4;
Start := 1;
Pre := False;
for i := 1 to Leveldo
begin

s := Copy(str,Start,Len1);
s1 := FourNumToChnNum(s,' 拾佰仟',Pre);
// 注意有两个空格
if s1<>'' then

Result := Result + s1 + Copy(ChnNum1,(Level-i)*2+1,2);;
Start := Start + Len1;
Len1 := 4;
end;

s1 := FourNumToChnNum(Copy(str,Len+2,2),'分角',Pre);
if s1 = '' then

s1 := '整';
Result := Result + s1 ;
end;

function RealToChnNum(realnum:real;Width:integer):string;
var
s:string;
begin

Str(realnum:Width:2,s);
Result := StringToChnNum(Trim(s));
end;
 
zengr (2001-02-20 15:26:00)
Function ChineseMoney(value:double):String;
var
SmallMoney,BigMoney:string;
wei1,qianwei1:string[2];
qianwei,dianweizhi,qian,number:Integer;
neg :Boolean;
begin
qianwei := -2 ;//小数点后的位置,这里为2位
neg := False;
SmallMoney := FormatFloat('0.00',value);
number := Length(SmallMoney);
if copy(trim(SmallMoney),1,1) ='-' then
begin
neg := True;
number := number -1;
SmallMoney := Copy(SmallMoney,2,number);
end;

dianweizhi := pos('.',SmallMoney);
for qian:= Length(SmallMoney)do
wnto 1do
//循环小写金额的每一位,从右到左
begin
if qian<>dianweizhi then
//如果读到的不是小数点就继续
begin
case StrToInt(Copy(SmallMoney,qian,1)) of
1:wei1 := '壹';
2:wei1 := '贰';
3:wei1 := '叁';
4:wei1 := '肆';
5:wei1 := '伍';
6:wei1 := '陆';
7:wei1 := '柒';
8:wei1 := '捌';
9:wei1 := '玖';
0:wei1 := '零';
end;
case qianwei of //判断大写位置
-3:qianwei1 :='厘';
-2:qianwei1 :='分';
-1:qianwei1 :='角';
0:qianwei1 :='元';
1,5,9:qianwei1 :='拾';
2,6,10:qianwei1 :='佰';
3,7,11:qianwei1 :='千';
4:qianwei1 :='万';
8:qianwei1 :='亿';
end;
inc (qianwei);
BigMoney := wei1+qianwei1+BigMoney;
//组合成大写金额
end;
end;
if neg then
Result := '负'+BigMoney
else
Result := BigMoney;
end;


吕雪松 (2001-02-20 15:56:00)
function ToDaxie(Money :do
uble) : string;
var
XiaoXie,DaXie : String;
Buf,TmpBuf : string;
I : integer;
P : integer;
MM : string;
begin
XiaoXie := '0123456789';
DaXie := '零壹贰叁肆伍陆柒捌玖';
MM := '分角拾佰仟万拾佰仟亿拾佰仟万';
Buf := FloatToStr(Money);
TmpBuf := '圆';
P := Pos('.',Buf);
if P = 0 then
P := Length(Buf) + 1;
for I := P + 1 to Length(Buf)do
begin
if Buf[P + 1] <> '0' then
TmpBuf := TmpBuf + Buf[P + 1] + Copy(MM, 5 - 2*(I - P),2);
end;
for I := 1 to P - 1do
begin
if Buf[P - I] <> '0' then
begin
if I <> 1 then
TmpBuf := Copy(MM,2*I + 1,2) + TmpBuf;
TmpBuf := Buf[P - I] + TmpBuf;
end;
end;
Buf := TmpBuf;
for I := 1 to Length(Buf)do
begin
if Buf <> '0' then
begin
P := Pos(Buf,XiaoXie);
if P > 0 then
Buf := StringReplace(Buf,Buf,Copy(DaXie,2*P-1,2),[rfReplaceAll]);
end;
end;
result := Buf;
end;


okhai (2001-02-23 1:53:00)
我也来试:
function xtod(xiao:double):string;
var I,longfront,longall:integer;
str1,dstr:string;
const frontdot='佰拾亿仟佰拾万仟佰拾元';//这里可以由你加多几位
backdot='角分厘毫姑婶婆';//也可以加
begin
longfront:=length(inttostr(trunc(xiao)));
//取得小数点前数字长度
dstr:=copy(frontdot,length(frontdot)-longfront*2+1,longfront*2)+backdot;//取得总金额对应单位
str1:=floattostr(xiao);
Delete(str1,longfront+1,1);//删除小数点
longall:=length(str1);
for i:=1 to longalldo
case strtoint(str1) of
0:result:=result+'零'+copy(dstr,i*2-1,2);
1:result:=result+'壹'+copy(dstr,i*2-1,2);
2:result:=result+'贰'+copy(dstr,i*2-1,2);
3:result:=result+'叁'+copy(dstr,i*2-1,2);
4:result:=result+'肆'+copy(dstr,i*2-1,2);
5:result:=result+'伍'+copy(dstr,i*2-1,2);
6:result:=result+'陆'+copy(dstr,i*2-1,2);
7:result:=result+'柒'+copy(dstr,i*2-1,2);
8:result:=result+'捌'+copy(dstr,i*2-1,2);
9:result:=result+'玖'+copy(dstr,i*2-1,2);
end;

end;
//from okhai
 
不好意思,写完才看到是JAVA版块的,肯定不符合你的要求了,请参考
给你个10行的:
function Changdx2(mmje:do
uble): String;
const
s1: String = '零壹贰叁肆伍陆柒捌玖';
s2: String = '分角元拾佰仟万拾佰仟亿拾佰仟万';
var s, dx: String;
i, Len: Integer;
function StrTran(const S, S1, S2: String): String;
begin

Result := StringReplace(S, S1, S2, [rfReplaceAll]);
end;
begin
if mmje < 0 then

begin
dx := '负';
mmje := -mmje;
end;
s := Format('%.0f', [mmje*100]);
Len := Length(s);
for i := 1 to Lendo

dx := dx + Copy(s1, (Ord(s) - Ord('0'))*2 + 1, 2) + Copy(s2, (Len - i)*2 + 1, 2);
dx := StrTran(StrTran(StrTran(StrTran(StrTran(dx, '零仟', '零'), '零佰', '零'), '零拾', '零'), '零角', '零'), '零分', '整');
dx := StrTran(StrTran(StrTran(StrTran(StrTran(dx, '零零', '零'), '零零', '零'), '零亿', '亿'), '零万', '万'), '零元', '元');
if dx = '整' then
Result := '零元整'
else

Result := StrTran(StrTran(StrTran(dx, '亿万', '亿零'), '零整', '整'), '零零', '零');
end;

{
200008000.07: 贰亿零捌仟元零柒分
200008000.00: 贰亿零捌仟元整
2000080000.00: 贰拾亿零捌万元整
}
 

Similar threads

回复
0
查看
1K
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
后退
顶部