大写转换,欢迎指正。
清明放假在家,随便写了一个转换大写的代码。当然,前辈们已经写了不少这种程序,珠玉在前,这里只是把我写的放上来,欢迎批评指正。
完全是兴之所至,自己独立写的东西,没有参考别人的代码,为了逻辑清楚,没有刻意追求所谓的代码最简化,当然,其实是可以简化的,比如CASE那段。
程序代码:
*\\*带角分的大写转换 -5hawn 2013清明 PARAMETERS ysz &&as Single PRIVATE zsbf as String,zsgs as String,xsbf as String,xsbfstr as String PRIVATE i as Byte,sub_zsgs as String,sub_jiedian as Byte ysz=ROUND(ysz,2) &&再次规范数值,避免越界。 IF ABS(ysz)>9999999999999.99 &&判断数值范围,超范围则中止。 MESSAGEBOX('数据超出限定范围,无法转换,程序终止!'+CHR(10)+ ; '提示:本程序只用于转换不大于[正负]9,999,999,999,999.99'+CHR(10)+ ; '大写:[正负]9万9千9百9拾9亿9千9百9拾9万9千9百9拾9元9角9分'+CHR(10)+; '的数值。请输入限定范围内的数据。', 16,'数据范围超限,程序中止!') RETURN ENDIF *\\*先判断正负。 IF ysz<0 zsgs='负' else zsgs='' ENDIF *\\*判断正负毕,取绝对值。 ysz=ABS(ysz) *\\*V整数部分。 zsbf=ALLTRIM(LEFT(str(ysz,16,2),13)) &&取整数字符串,根据字串长度确定位数。 zsgs=zsgs+right('X万X仟X佰X拾X亿X仟X佰X拾X万X仟X佰X拾X元',LEN(zsbf)*3) FOR i=1 TO LEN(zsbf) IF LEN(zsbf)-i=8 or LEN(zsbf)-i=4 OR LEN(zsbf)-i=0 &&亿、万、元为节点值,即使数值为0,也不能去掉 sub_jiedian=0 ELSE sub_jiedian=2 &&如不为节点值,则去掉称谓,如把“X佰”换成“零”,“佰”去掉。 endif IF SUBSTR(zsbf,i,1)='0' &&值为0时,才考虑节点值问题,否则不考虑。 sub_zsgs=SUBSTR(zsgs,AT("X",zsgs),1+sub_jiedian) else sub_zsgs=SUBSTR(zsgs,AT("X",zsgs),1) endif zsgs=STrtran(zsgs,sub_zsgs,singlestr(SUBSTR(zsbf,i,1)),1,1) NEXT i DO WHILE '零零'$zsgs zsgs=STrtran(zsgs,'零零','零') ENDDO *\\*下面几句的顺序很重要而玄妙。 zsgs=STrtran(zsgs,'零亿','亿') zsgs=STrtran(zsgs,'零万','万') zsgs=STrtran(zsgs,'亿万','亿零') zsgs=STrtran(zsgs,'零零','零') zsgs=STrtran(zsgs,'零元','元') *\\*^整数部分。 *\\*V小数部分。 IF ysz-INT(ysz)#0 xsbf=RIGHT((STR((ysz-INT(ysz)),3,2)),2) xsbfstr=IIF(LEFT(xsbf,1)='0','零',singlestr(LEFT(xsbf,1))+'角') xsbfstr=xsbfstr+IIF(RIGHT(xsbf,1)='0','正',singlestr(RIGHT(xsbf,1))+'分') *!* MESSAGEBOX(xsbfstr,0,'Return xsbfstr') ELSE xsbfstr='正' ENDIF *\\*^小数部分。 zsgs=zsgs+xsbfstr *!* MESSAGEBOX(zsgs,0,'Return zsgs') RETURN zsgs *============单字符转换============== FUNCTION singlestr (sigstr as String) DO case CASE sigstr='0' RETURN '零' CASE sigstr='1' RETURN '壹' CASE sigstr='2' RETURN '贰' CASE sigstr='3' RETURN '叁' CASE sigstr='9' RETURN '玖' CASE sigstr='4' RETURN '肆' CASE sigstr='5' RETURN '伍' CASE sigstr='6' RETURN '陆' CASE sigstr='7' RETURN '柒' CASE sigstr='8' RETURN '捌' ENDCASE ENDFUNC