小写金额转换为大写金额? ( 积分: 50 )

  • 主题发起人 主题发起人 ctdd83238
  • 开始时间 开始时间
C

ctdd83238

Unregistered / Unconfirmed
GUEST, unregistred user!
小写金额转换为大写金额,把SUM转为大写金额?
 
小写金额转换为大写金额,把SUM转为大写金额?
 
这个东西我有,让我找找在不在我现在这台机器上
 
是要中文的还是英文的啊?
 
小写金额转换成大写金额的procedure源码
--drop proc ConvertToUpperCase
/*declare @a varchar(50) --@a为欲转换的大写金额
exec ConvertToUpperCase 1000000,@a output --将123456789.56转换成大写金额
select @a --在QA中查看效果
*/
/*declare @a varchar(50) --@a为欲转换的大写金额
exec ConvertToUpperCase 1056031010000,@a output
select @a */

if exists (select * from sysobjects where objectproperty(object_id('ConvertToUpperCase'), 'IsProcedure') = 1)
drop procedure ConvertToUpperCase
GO
create procedure ConvertToUpperCase
(@mExpense Money,
@sRetUpperMoney varchar(50) OutPut)
as
begin
declare @sExpense varchar(20),@sLittle varchar(4),@sFixed varchar(15)
declare @nDot Integer,@nLenAll Integer,@sUpperMoney varchar(30),@nStep Integer
declare @cChar char(1),@sUpperNumbers varchar(30),@sNumber char(2),@sTemp varchar(50)
declare @sZero char(2),@nIsZeroLast Integer,@sth varchar(10),@nFixed Integer
declare @sMoney char(2)
if @mExpense=0
begin
select @sRetUpperMoney='零元'
return
end
if @mExpense<0
begin
select @sMoney='负'
select @mExpense=abs(@mExpense)
end
else
select @sMoney=''
select @sUpperMoney = '佰拾万仟佰拾亿仟佰拾万仟佰拾元' --加大范围,这里设计len(@sUpperMoney)<=15,再大这种算法就不适合了。
select @sUpperNumbers= '玖捌柒陆伍肆叁贰壹零'
select @sZero = '零'
select @sExpense = convert(varchar(20),@mExpense)
select @nDot = CharIndex('.',@sExpense)
select @nLenAll = Len(@sExpense)
if @nDot > 0
begin
select @sFixed = substring(@sExpense,1,@nDot -1)
select @sLittle = substring(@sExpense,@nDot + 1,@nLenAll - @nDot)
end
else
select @sFixed = @sExpense
select @nFixed = Len(@sFixed)
select @nStep = @nFixed
select @sTemp = ''
select @nIsZeroLast = 0
if @sFixed <> '0'
while @nStep > 0
begin
--while @nStep > 0
select @cChar = substring(@sFixed,@nStep,1)
select @sNumber = substring(@sUpperNumbers,10 - convert(int,@cChar),1)
select @sth = substring(@sUpperMoney,len(@sUpperMoney) - (Len(@sFixed) - @nStep),1)
if @cChar <> '0'
begin
--if @cChar <> '0'
if @nIsZeroLast = 0
select @sTemp = @sNumber + @sth + @sTemp
if @nIsZeroLast = 1
begin
select @sTemp = @sNumber + @sth + @sZero + @sTemp
select @nIsZeroLast = 0
end
if @nIsZeroLast = 2
begin
select @sTemp = @sNumber + @sth + @sTemp
select @nIsZeroLast = 0
end
end --if @cChar <> '0'
else
--@cChar = '0'
begin
if @nIsZeroLast <> 2
begin
--@nIsZeroLast <> 2
if (@sth = '万') or (@sth = '亿') or (@sth = '元')
begin

if @nIsZeroLast = 1
begin
select @sTemp = @sth + @sZero + @sTemp
if substring(@sTemp,1,3)='亿万零' --修改
select @sTemp=stuff(@sTemp,1,3,'亿零')
if substring(@sTemp,1,2)='万零' --修改
select @sTemp=stuff(@sTemp,1,2,'零')
select @nIsZeroLast = 2
end
else
begin
select @sTemp = @sth + @sTemp
if substring(@sTemp,1,2)='万元' and @nStep>4--修改
select @sTemp=stuff(@sTemp,1,2,'元')
if substring(@sTemp,1,3)='亿万元'
select @sTemp=stuff(@sTemp,1,3,'亿元')
select @nIsZeroLast = 2
end
end
else

select @nIsZeroLast = 1
end
else
--@nIsZeroLast = 2
begin
if (@sth = '仟')
select @nIsZeroLast = 0
end
end --@nIsZeroLast <> 2
select @nStep = @nStep - 1
end --while @nStep > 0
declare @sTempLittle varchar(10),@sFirst char(1),@sSecond char(1)
select @sFirst = '',@sSecond = ''
if Len(@sLittle) = 2
begin
select @sFirst = substring(@sLittle,1,1),@sSecond = substring(@sLittle,2,1)
end
if Len(@sLittle) = 1
begin
select @sFirst = substring(@sLittle,1,1)
end
select @sTempLittle = ''
if (@sFirst <> '') and (@sFirst <> '0')
begin
select @sNumber = substring(@sUpperNumbers,10 - convert(int,@sFirst),1)
select @sTempLittle = @sTempLittle + @sNumber + '角'
end
if (@sSecond <> '') and (@sSecond <> '0')
begin
select @sNumber = substring(@sUpperNumbers,10 - convert(int,@sSecond),1)
select @sTempLittle = @sTempLittle + @sNumber + '分'
end
select @sRetUpperMoney = @sMoney + @sTemp + @sTempLittle
end
 
在fastreport中把本页小计的数小写金额转换为大写金额
 
function TfrmMain.LongXxToDx(hjnum : Currency;
strNum : string) : string;
var
Vstr : string;
zzz : string;
cc : string;
cc1 : string;
Presult : string;
xxbb : array[1..16] of string;
uppna : array[0..9] of string;
iCount : integer;
iZero : integer;
vPoint : integer;
vdtlno : integer;
begin
//*设置大写中文数字和相应单位数组*//
xxbb[1] := '万';
xxbb[2] := '仟';
xxbb[3] := '佰';
xxbb[4] := '拾';
xxbb[5] := '亿';
xxbb[6] := '仟';
xxbb[7] := '佰';
xxbb[8] := '拾';
xxbb[9] := '万';
xxbb[10] := '仟';
xxbb[11] := '佰';
xxbb[12] := '拾';
xxbb[13] := '元';
xxbb[14] := '.';
xxbb[15] := '角';
xxbb[16] := '分';
uppna[0] := '零';
uppna[1] := '壹';
uppna[2] := '贰';
uppna[3] := '叁';
uppna[4] := '肆';
uppna[5] := '伍';
uppna[6] := '陆';
uppna[7] := '柒';
uppna[8] := '捌';
uppna[9] := '玖';
Str(hjnum : 16 : 2, Vstr);
//Vstr := strNum;
cc := '';
cc1 := '';
zzz := '';
result := '';
presult := '';
iZero := 0;
vPoint := 0;
for iCount := 1 to 14do
begin
cc := Vstr[iCount];
if cc <> ' ' then
begin
zzz := xxbb[iCount];
if cc = '0' then
begin
if iZero < 1 then
//*对“零”进行判断*//
cc := '零'
else
cc := '';
if iCount = 5 then
//*对亿位“零”的处理*//
begin
if iZero < 3 then
begin
if copy(result, length(result) - 1, 2) = '零' then
result := copy(result, 1, length(result) - 2) + xxbb[iCount]
+ '零'
else
result := result + xxbb[iCount];
end;
end;
if iCount = 9 then
//*对万位“零”的处理*//
begin
if iZero < 3 then
begin
if copy(result, length(result) - 1, 2) = '零' then
result := copy(result, 1, length(result) - 2) + xxbb[iCount]
+ '零'
else
result := result + xxbb[iCount];
end;
end;
cc1 := cc;
zzz := '';
iZero := iZero + 1;
end
else
begin
if cc = '.' then
begin
cc := '';
if (cc1 = '') or (cc1 = '零') then
begin
Presult := copy(result, 1, Length(result) - 2);
result := Presult;
iZero := 15;
end;
if iZero >= 1 then
zzz := xxbb[13]
else
zzz := '';
vPoint := 1;
end
else
begin
iZero := 0;
cc := uppna[StrToInt(cc)];
end
end;
result := result + (cc + zzz)
end;
end;
if Vstr[15] = '0' then
//*对小数点后两位进行处理*//
begin
if Vstr[16] <> '0' then
begin
cc := '零';
result := result + cc;
cc := uppna[StrToInt(Vstr[16])];
result := result + (uppna[0] + cc + xxbb[16]);
end
end
else
begin
if iZero = 15 then
begin
cc := '零';
result := result + cc;
end;
cc := uppna[StrToInt(Vstr[15])];
result := result + (cc + xxbb[15]);
if Vstr[16] <> '0' then
begin
cc := uppna[StrToInt(Vstr[16])];
result := result + (cc + xxbb[16]);
end;
end;
result := result + '正';
end;

这个是delphi里的实现,不过有点问题,在万亿位上会出问题。
千亿以下基本都正确,做抛砖引玉吧。
 
在fastreport中如何引用转换函数
 
有没有搞错,10行就够了
 
function TForm_Accessory_detail.SmallTOBig(const small: real;
const iPosition: integer): string;
var
SmallMonth, BigMonth: string;
wei1, qianwei1: string[2];
qianwei, dianweizhi, qian: integer;
begin
{------- 修改参数令值更精确 -------}
qianwei := iPosition;{小数点后的位置,需要的话也可以改动-2值}
Smallmonth := FormatFloat('0.00', small);{转换成货币形式,需要的话小数点后加多几个零}
{---------------------------------}
dianweizhi := pos('.', Smallmonth);{小数点的位置}
for qian := length(Smallmonth)do
wnto 1do
{循环小写货币的每一位,从小写的右边位置到左边}
begin
if qian <> dianweizhi then
{如果读到的不是小数点就继续}
begin
case strtoint(copy(Smallmonth, 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{判断大写位置,可以继续增大到real类型的最大值}
-3: qianwei1 := '厘';
-2: qianwei1 := '分';
-1: qianwei1 := '角';
0 : qianwei1 := '元';
1 : qianwei1 := '拾';
2 : qianwei1 := '佰';
3 : qianwei1 := '千';
4 : qianwei1 := '万';
5 : qianwei1 := '拾';
6 : qianwei1 := '佰';
7 : qianwei1 := '千';
8 : qianwei1 := '亿';
9 : qianwei1 := '十';
10: qianwei1 := '佰';
11: qianwei1 := '千';
end;
inc(qianwei);
BigMonth := wei1 + qianwei1 + BigMonth;{组合成大写金额}
end;
end;
SmallTOBig := BigMonth;
end
 
无泪:
你的存储过程有问题
declare @a varchar(50) --@a为欲转换的大写金额
exec ConvertToUpperCase 1000001.02,@a output
select @a
返回值为: 壹佰零壹元贰分
根本就不对!!
 
用函数,加个计算字段:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2444611
 
procedure Tclo.BitBtn8Click(Sender: TObject);
var ss,i:integer;m:string;
const kgd: array [0..9] of string=('零','壹','贰','叁','肆','伍','陆','柒','捌','玖');
kgd1: array [0..10] of string=('分','角','元','拾','佰','仟','万','拾','佰','仟','亿');
begin

m:='';
//转换后的大写金额
sss:=aaa;// 要转换的小写金额
for i:=0 to length(sss)-1do
m:=kgd[strtoint(copy(sss,length(sss)-i,1))]+' '+kgd1+''+m;
end;
 
后退
顶部