大写转换,欢迎指正。
清明放假在家,随便写了一个转换大写的代码。当然,前辈们已经写了不少这种程序,珠玉在前,这里只是把我写的放上来,欢迎批评指正。
完全是兴之所至,自己独立写的东西,没有参考别人的代码,为了逻辑清楚,没有刻意追求所谓的代码最简化,当然,其实是可以简化的,比如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









