huangyf - 2016/6/28 10:07:39
在水晶报表,公式工作室中新建报表自定义函数,函数内容如下:
Function (numbervar Amount) //金额转英文大写,Crystal语法 local stringVar array smallNumbers := ["ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE", "TEN", "ELEVEN", "TWELVE", "THIRTEEN", "FOURTEEN", "FIFTEEN", "SIXTEEN", "SEVENTEEN", "EIGHTEEN", "NINETEEN"]; local stringVar array tensNumbers := ["", "", "TWENTY", "THIRTY", "FORTY", "FIFTY", "SIXTY", "SEVENTY", "EIGHTY", "NINETY"]; local stringVar array scaleNumers := ["", "THOUSAND", "MILLION", "BILLION" ]; local stringVar End := "ONLY";
//小数点前 local numberVar decimals1; //小数点后 local numberVar decimals2;
//纯小数 If Amount <1 then decimals1 := 0 else decimals1 := Cdbl(Left(Replace(cstr(Amount*100,0),",",""),length(Replace(cstr(Amount*100,0),",",""))-2));
local numberVar decimals2 := Cdbl(Right(Replace(cstr(Amount*100,0),",",""),2));
//初始化显示英文为ZERO stringVar combined1 := smallNumbers[1]; stringVar combined2 := smallNumbers[1];
if decimals1 <> 0 then ( numberVar i := 1; numberVar array digitGroups := [0,0,0,0];
//将金额拆分成4段,每段放3位数,即:XXX,XXX,XXX,XXX。最大仅支持到Billion, for i := 1 to 4 step 1 do ( digitGroups := decimals1 mod 1000; decimals1 := Int(decimals1 / 1000); );
stringVar array groupText1 := ["","","",""];
//处理每段的金额转英文,百位+十位+个位 for i:=1 to 4 step 1 do ( numberVar hundreds := Int(digitGroups / 100); numberVar tensUnits := digitGroups mod 100;
//百位 if hundreds <> 0 then ( groupText1 := groupText1 + smallNumbers[hundreds+1] + " HUNDRED"; if tensUnits <> 0 then groupText1 := groupText1 + " "; );
//十位和个位 numberVar tens := Int(tensUnits / 10); numberVar units := tensUnits mod 10;
if tens >= 2 then //十位大于等于20 ( groupText1 := groupText1 + tensNumbers[tens+1]; if units <> 0 then groupText1 := groupText1 + " " + smallNumbers[units+1]; ) else if tensUnits <> 0 then //十位和个位,小于20的情况 groupText1 := groupText1 + smallNumbers[tensUnits +1] );
//金额的个十百位赋值到combined combined1 := groupText1[1];
//将金额排除个十百位以外,余下的3段英文数字,加上千位分隔符英文单词,Thousand/Million/Billion for i:=2 to 4 step 1 do ( if digitGroups <> 0 then ( stringVar prefix := groupText1 + " " + scaleNumers; //A:组合Thousand 和Billion if Length(combined1) <> 0 then //B:如果金额的百位+十位+个位非0,则在后面加上空格 prefix := prefix+ " "; combined1 := prefix + combined1; //再连接 A+B ); ); );
if decimals2 <> 0 then ( //十位和个位 numberVar tens := Int(decimals2 / 10); numberVar units := decimals2 mod 10;
if decimals2 >= 20 then //20~99 ( combined2 := "AND CENTS " + tensNumbers[tens+1]; if units <> 0 then combined2 := combined2 + " " + smallNumbers[units+1]; ) else if decimals2 > 1 then //19到2之间 combined2 := "AND CENTS " + smallNumbers[decimals2 +1] else combined2 := "AND CENT " + smallNumbers[decimals2 +1]
);
if combined1 <> "ZERO" Then if combined2 <> "ZERO" Then combined1 +" "+ combined2 + " " + End else combined1+ " " + End else if combined2 <> "ZERO" Then combined2 + " " + End else "ZERO"; 附件:
金额英文大写.jpg