人民币小写转大写自制函数,与大家分享、交流。(5分)

  • 主题发起人 主题发起人 Yang J.Q.
  • 开始时间 开始时间
Y

Yang J.Q.

Unregistered / Unconfirmed
GUEST, unregistred user!
下面就是,若有需改进的地方或更好的方法,请指教。
function DaXie(XiaoXieJinE:do
uble): string;
var
DaXieCurr: String;
// 存放大写金额字符串
IntPart, FracPart: String;
// 存放整数与小数部分的字符串
IntLength, FracLength: Integer;
// 整数与小数部分各自的长度
PrevZero: Boolean;
// 前一位是否为0(连续的0只输出一个)
I, J: Integer;
begin
try
DaXieCurr := CurrToStr(Round(XiaoXieJinE*100.0)/100.0);
except
Application.MessageBox('金额过大,不能转换成货币大写格式!',
'警告:', MB_OK);
try
Result := '(巨额)' + FloatToStr(Round(XiaoXieJinE*100.0)/100.0)+ '(巨额)';
except
Result := '(金额超大!!!)';
end;
Exit;
end;
// if StrToFloat(DaXieCurr) = 0 then
// begin
// Result := '零元';
// Exit;
// end;
//分离整数部分(IntPart)和小数部分(FracPart),
//并分别求出它们的长度(IntLength,FracLength).
IntLength := Pos('.', DaXieCurr)-1;
if IntLength = -1 then
begin
//没找到'.',因此是整数.
IntPart := DaXieCurr;
IntLength := Length(DaXieCurr);
FracPart := '';
FracLength := 0;
end
else
begin
IntPart := Copy(DaXieCurr, 1, IntLength);
FracLength := Length(DaXieCurr) - IntLength - 1;
FracPart := Copy(DaXieCurr, IntLength+2, FracLength);
end;
DaXieCurr := '';
PrevZero := False;
// 处理整数部分
if (IntLength=0) or (StrToInt64(IntPart)=0) then
begin
if (FracLength=0) or (StrToFloat(FracPart)=0.0) then
begin
Result := '零元';
Exit;
end
end
else
begin
for I:=1 to IntLengthdo
begin
J := IntLength - I;
// 当前数字所处'位'编号
if IntPart='0' then
begin
if not PrevZero then
PrevZero := True;
end
else
begin
if PrevZero then
DaXieCurr := DaXieCurr + '0';
PrevZero := False;
case (J mod 4) of
3: DaXieCurr := DaXieCurr + IntPart + '仟';
2: DaXieCurr := DaXieCurr + IntPart + '佰';
1: DaXieCurr := DaXieCurr + IntPart + '拾';
0: DaXieCurr := DaXieCurr + IntPart;
end;
end;
if (J mod 4) = 0 then
// 升位处理:'万'与'亿'
begin
case (J div 4) mod 2 of
0:
if (J div 4)=0 then
DaXieCurr := DaXieCurr + '元'
else
DaXieCurr := DaXieCurr + '亿';
1: DaXieCurr := DaXieCurr + '万';
end;
end;
end;
end;
if (FracLength<>0) and (StrToFloat(FracPart)<>0.0) then
begin
if FracPart[1] <> '0' then
begin
DaXieCurr := DaXieCurr + FracPart[1] + '角';
if FracPart[2] <> '0' then
DaXieCurr := DaXieCurr + FracPart[2] + '分';
end
else
begin
if FracPart[2] <> '0' then
begin
if (IntLength<>0) and (StrToInt64(IntPart)<>0) then
DaXieCurr := DaXieCurr + '0';
DaXieCurr := DaXieCurr + FracPart[2] + '分';
end;
end;
end
else
DaXieCurr := DaXieCurr + '正';
DaXieCurr := StringReplace(DaXieCurr, '0', '零', [rfReplaceAll]);
DaXieCurr := StringReplace(DaXieCurr, '1', '壹', [rfReplaceAll]);
DaXieCurr := StringReplace(DaXieCurr, '2', '贰', [rfReplaceAll]);
DaXieCurr := StringReplace(DaXieCurr, '3', '叁', [rfReplaceAll]);
DaXieCurr := StringReplace(DaXieCurr, '4', '肆', [rfReplaceAll]);
DaXieCurr := StringReplace(DaXieCurr, '5', '伍', [rfReplaceAll]);
DaXieCurr := StringReplace(DaXieCurr, '6', '陆', [rfReplaceAll]);
DaXieCurr := StringReplace(DaXieCurr, '7', '柒', [rfReplaceAll]);
DaXieCurr := StringReplace(DaXieCurr, '8', '捌', [rfReplaceAll]);
DaXieCurr := StringReplace(DaXieCurr, '9', '玖', [rfReplaceAll]);
Result := DaXieCurr;
end;
 
用不着这么复杂吧?
用不着做什么升位,整数位处理,小数位处理,用一个String就搞定了!
你不妨查查已答问题,好多高手答过的.很多写的非常精彩!
(唉,我也贴过一个,还给版主骂了灌水,真是失败!)
 
对于类似10001之类的金额,应读成壹万零一圆整而非壹万零仟零佰零一圆整,
工商银行的支票上好像是这样要求的。
 
delphi 代码:
function thkd.sz2hz(sztmp:string):string;
var
i,n,have0:integer;
hzstr,hztmp,szstr,bwhz,m2w:string;
//hzstr='零壹贰叁肆伍陆柒捌玖分角元拾佰仟万亿兆整':string;
//hzdwc='分角元拾佰仟万拾佰仟亿拾佰仟兆拾佰仟':string;
const
hzdw='分角元拾佰仟万拾佰仟亿拾佰仟兆拾佰仟';
hz0='零';
hz1='壹';
hz2='贰';
hz3='叁';
hz4='肆';
hz5='伍';
hz6='陆';
hz7='柒';
hz8='捌';
hz9='玖';
hzdwf='分';
hzdwj='角';
hzdwy='元';
hz10='拾';
hzb='佰';
hzq='仟';
hzw='万';
hzy='亿';
hzz='兆';

begin
result:='';
n:=length(sztmp);
if n<4 then
begin
result:='长度不够';exit;
end;
if n>18 the begin
result:='数字串超长';exit;
end;
//去掉小数点
if (sztmp[n-2]<>'.') then
begin
result:='数字串格式不对';exit;
end
else
begin
szstr:=copy(sztmp,1,n-3)+copy(sztmp,n-1,2);
n:=n-1;
end;
hztmp:='';
for i:=1 to ndo
begin
case szstr of
'0':bwhz:=hz0;
'1':bwhz:=hz1 ;
'2':bwhz:=hz2 ;
'3':bwhz:=hz3 ;
'4':bwhz:=hz4 ;
'5':bwhz:=hz5 ;
'6':bwhz:=hz6 ;
'7':bwhz:=hz7 ;
'8':bwhz:=hz8 ;
'9':bwhz:=hz9 ;
else
begin
result:='数字串非法';
exit;
end;
end;
hztmp:=hztmp+bwhz+copy(hzdw,2*(n-i)+1,2);
end;

//result:=hzdw[3]+hzdw[4];
//result:=hztmp;
//exit;
if (n=3) and (szstr[1]='0') {0.xx}
then
begin
if szstr[n-1]='0'{0.0x}
then
if szstr[n]='0'{0.00} then
result:='零元'
{0.0X} else
result:=copy(hztmp,4*n-3,4)
{szstr[n-1]<>'0'}else
if szstr[n]='0'{0.X0} then
result:=copy(hztmp,4*(n-1)-3,4)+'整'
{0.XX} else
result:=copy(hztmp,4*(n-1)-3,8);
exit;
end;
//末尾2位的汉字串{小数部分}
if szstr[n-1]='0' then
if szstr[n]='0' then
m2w:='整' {.00}
else
m2w:='零'+copy(hztmp,4*n-3,4){.0X}
{szstr[n-1]<>'0'} else
if szstr[n]='0' then
m2w:=copy(hztmp,4*(n-1)-3,4)+'整'{.X0}
else
m2w:=copy(hztmp,4*(n-1)-3,8);{.XX}
have0:=0;
hzstr:='';
// {整数部分:XXXX, XXXX, XXXX, XXXX.}
{第 4, 3, 2, 1.部分}
for i:=1 to n-2do
{从高位向低位读}
begin
if szstr='0' then
begin
{1}
inc(have0);
{有0则HAVE0加1}
if ((i=n-2)or(i=n-6)or (i=n-10) or (i=n-14)) {如果个(元)位、万位、亿位、兆位为0}
then
begin
if have0=1 then
hzstr:=hzstr+copy(hztmp,4*i-1,2){仅该位为0}
else
begin
{前几位有0}
{个位} If (i=n-2) then
hzstr:=copy(hzstr,1,length(hzstr)-2)+copy(hztmp,4*i-1,2){'元'}
else
if have0=4 then
begin
{第2或3,4部分全为0}
if szstr[i+1]='0' then
{后一部分第一位为0}
{从HZSTR中删除‘零’字} hzstr:=copy(hzstr,1,length(hzstr)-2);
end
{该部分仅后几位为0,删除‘零’字并加单位} else
begin
hzstr:=copy(hzstr,1,length(hzstr)-2)+copy(hztmp,4*i-1,2);
end
end;
have0:=0;{如果个(元)位、万位、亿位、兆位为0,处理后将HAVE0置0}
end
else
if have0=1 then
hzstr:=hzstr+hz0;{遇第一个0则读出}
end{1}
{if szstr<>'0'} else
begin
{遇非0数字则读出该位并将HAVE0置0}
hzstr:=hzstr+copy(hztmp,4*i-3,4);
have0:=0;
end;

end{for};
result:=hzstr+m2w;{返回值=整数位+小数位}
end;

代码已经经过测试,注意:
输入参数:
参数必须有两位小数位,请自己在外围控制。

 
to Yang J.Q.:
不好意思,没仔细看你的程序,今天早上上来,看了一下,将自己程序改了改,正要贴出
发现已有redwasp兄的大作在上头,因思路相似就不贴了.
报告一个Bug:
输入:100000789.01
输出:壹亿万零柒佰捌拾玖元零壹分
^^^^^^^
有问题,redwasp兄的就正确了
 
多人接受答案了。
 
后退
顶部