标题:大写转换,欢迎指正。
只看楼主
厨师王德榜
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:183
帖 子:942
专家分:4724
注 册:2013-2-16
结帖率:100%
已结贴  问题点数:5 回复次数:3 
大写转换,欢迎指正。
清明放假在家,随便写了一个转换大写的代码。
当然,前辈们已经写了不少这种程序,珠玉在前,这里只是把我写的放上来,欢迎批评指正。
完全是兴之所至,自己独立写的东西,没有参考别人的代码,为了逻辑清楚,没有刻意追求所谓的代码最简化,当然,其实是可以简化的,比如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
收到的鲜花
  • tlliqi2013-04-05 14:19 送鲜花  20朵   附言:给你鼓励
搜索更多相关主题的帖子: 清明 color 在家 
2013-04-05 13:01
lygcw9603
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:233
专家分:357
注 册:2006-8-27
得分:3 
程序代码:
IF ABS(ysz)>9999999999999.99    &&判断数值范围,超范围则中止。
   TEXT TO MESSAGEINFO NOSHOW
   数据超出限定范围,无法转换,程序终止!
   提示:本程序只用于转换不大于[正负]9,999,999,999,999.99
   大写:[正负]9万9千9百9拾9亿9千9百9拾9万9千9百9拾9元9角9分
   的数值。请输入限定范围内的数据。
   ENDTEXT
   RETURN MESSAGEBO(MESSAGEINFO, 16,[数据范围超限,程序中止!])
ENDIF
2013-04-05 13:48
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:2 
很复杂的大写规则

授人以渔,不授人以鱼。
2013-04-06 12:34
梦幻倩影
Rank: 5Rank: 5
等 级:职业侠客
威 望:8
帖 子:162
专家分:352
注 册:2016-8-19
得分:0 
PROCEDURE dxxfun
PARAMETERS mmje  &&输入变量:数字型,小于9万亿,大于-9万亿
PRIVATE dx,aa,i
dx=IIF(mmje<0,'负','')
aa=ROUND(ABS(mmje)*100,0)
FOR i=LEN(ALLTRIM(STR(aa,15)))-1 to 0 STEP -1
   dx=dx+SUBS('零壹贰叁肆伍陆柒捌玖',INT(ROUND(aa/10^i,10))*2+1,2)+SUBS('分角元拾佰仟万拾佰仟亿拾佰仟万',i*2+1,2)
   aa=MOD(aa,10^i)
endf
dx=STRTRAN(STRTRAN(STRTRAN(STRTRAN(STRTRAN(dx,'零仟','零'),'零佰','零'),'零拾','零'),'零角','零'),'零分','整')
dx=STRTRAN(STRTRAN(STRTRAN(STRTRAN(STRTRAN(dx,'零零','零'),'零零','零'),'零亿','亿'),'零万','万'),'零元','元')
RETURN IIF(dx='整','零元整',STRTRAN(STRTRAN(dx,'亿万','亿'),'零整','整'))
2016-10-28 09:16



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-403078-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.138569 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved