再次修改,能处理输入3个参数(分别表示年、月、日)的情况
*FUNCTION CDTOCD
***
*** 日期转换为大写的自定义函数 CDTOCD
***
*** 语法 CDTOCD(cDate1,nMonth,nDay)
***
*** 输入参数cDate1
*** (1)字符型,1个参数或多个参数,只有第1个参数有效
*** 14个字符,格式是“YYYY年MM月DD日”或者“YYYY..MM..DD..”(".."可以是任何无关字符)
*** 10个字符,格式是“YYYY.MM.DD”(.也可以是任何无关字符)
*** 8个字符,格式是“YYYYMMDD”
*** (2)日期型,1个参数或多个参数,只有第1个参数有效
*** 任何格式,只要是日期型就可以
*** (3)日期时间型,1个参数或多个参数,只有第1个参数有效
*** 日期时间型
*** (4)数值型,1个参数
*** 格式"YYYYMMDD",8位整数
*** (5)数值型,3个参数都是数值型
*** 格式CDTOCD(YYYY,MM,DD),3个整数
***
*** 输出结果
*** 字符型
***
*** 特别说明
*** 如果输入参数不是字符型,不是日期型,不是日期时间型,也不是数值型,则返回14个星号(*);
*** 如果输入参数是字符型,但没有按规定的格式输入,比如年份写在后面等,返回的结果可能不正确
***
*** 用法: ?CDTOCD("2006年06月25日") &&结果为“贰零零陆年零陆月贰拾伍日”
*** ?CDTOCD("2006.06.25")
*** ?CDTOCD("20060625")
*** ?CDTOCD(DATE()) &&显示系统日期的大写方式
*** ?CDTOCD(DATETIME())
*** ?CDTOCD(DTOC(DATE(),1))
*** ?CDTOCD(20060625) &&显示“贰零零陆年零陆月贰拾伍日”
*** ?CDTOCD(2006,6,25) &&显示“贰零零陆年零陆月贰拾伍日”
***
PARAMETERS cDate1,nMonth,nDay
PRIVATE cString1,cString2,nYear,nMonth,nDay,I,cDate1
cString1="0123456789"
cString2="零壹贰叁肆伍陆柒捌玖"
* 提取年、月、日信息
DO CASE
CASE TYPE("cDate1")=CHR(67) AND LEN(cDate1)=14 &&第1个参数是字符型C,14个字符
nYear=VAL(SUBSTR(cDate1,1,4))
nMonth=VAL(SUBSTR(cDate1,7,2))
nDay=VAL(SUBSTR(cDate1,11,2))
CASE TYPE("cDate1")=CHR(67) AND LEN(cDate1)=10 &&第1个参数是字符型C,10个字符
nYear=VAL(SUBSTR(cDate1,1,4))
nMonth=VAL(SUBSTR(cDate1,6,2))
nDay=VAL(SUBSTR(cDate1,9,2))
CASE TYPE("cDate1")=CHR(67) AND LEN(cDate1)=8 &&第1个参数是字符型C,8个字符
nYear=VAL(SUBSTR(cDate1,1,4))
nMonth=VAL(SUBSTR(cDate1,5,2))
nDay=VAL(SUBSTR(cDate1,7,2))
CASE TYPE("cDate1")=CHR(68) OR TYPE("cDate1")=CHR(84) &&第1个参数是日期型D或日期时间型T
nYear=YEAR(cDate1)
nMonth=MONTH(cDate1)
nDay=DAY(cDate1)
CASE TYPE("cDate1")=CHR(78) AND (TYPE("nMonth")#CHR(78) OR TYPE("nDay")#CHR(78)) &&第1个参数为数值型N,第2、第3个参数不完全是数值型
nYear=VAL(SUBSTR(PADL(cDate1,8,"0"),1,4))
nMonth=VAL(SUBSTR(PADL(cDate1,8,"0"),5,2))
nDay=VAL(SUBSTR(PADL(cDate1,8,"0"),7,2))
CASE TYPE("cDate1")=CHR(78) AND TYPE("nMonth")=CHR(78) AND TYPE("nDay")=CHR(78) &&3个参数都是数值型N,分别表示年、月、日
nYear=cDate1 &&提取年份信息
IF nYear<0 OR nYear>9999 &&年份为公元后纪年(不考虑公元前)
RETURN REPLICATE("*",14)
ENDIF
IF nMonth<1 OR nMonth>12 &&提取月份信息,月份范围为1-12
RETURN REPLICATE("*",14)
ENDIF
DO CASE &&提取日信息
CASE INLIST(nMonth,1,3,5,7,8,10,12) &&大月
IF nDay<1 OR nDay>31 &&大月的日范围为1-31
RETURN REPLICATE("*",14)
ENDIF
CASE INLIST(nMonth,4,6,9,11) &&小月
IF nDay<1 OR nDay>30 &&小月的日范围为1-30
RETURN REPLICATE("*",14)
ENDIF
CASE nMonth=2 AND (MOD(nYear,4)#0 OR MOD(nYear,4)=0 AND MOD(nYear,100)=0 AND MOD(nYear,400)#0) &&平年2月
IF nDay<1 OR nDay>28 &&平年的2月的日范围为1-28
RETURN REPLICATE("*",14)
ENDIF
CASE nMonth=2 AND (MOD(nYear,4)=0 AND MOD(nYear,100)#0 OR MOD(nYear,400)=0) &&闰年2月
IF nDay<1 OR nDay>29 &&闰年的2月的日范围1-29
RETURN REPLICATE("*",14)
ENDIF
ENDCASE
OTHERWISE &&其他不合语法规则的数据或无参数等所有情况
RETURN REPLICATE("*",14)
ENDCASE
*转换"年"
cDate2=""
FOR I=1 TO 4
cDate2=cDate2+SUBSTR(cString2,VAL(SUBSTR(PADL(nYear,4,"0"),I,1))*2+1,2)
ENDFOR
cDate2=cDate2+"年"
*转换"月"
DO CASE
CASE MOD(nMonth,10)=0
cDate2=cDate2+"拾月"
CASE nMonth<10
cDate2=cDate2+"零"+SUBSTR(cString2,nMonth*2+1,2)+"月"
OTHERWISE
cDate2=cDate2+"拾"+SUBSTR(cString2,nMonth*2-19,2)+"月"
ENDCASE
*转换"日"
DO CASE
CASE MOD(nDay,10)=0
cDate2=cDate2+SUBSTR(cString2,INT(nDay/10)*2+1,2)+"拾日"
CASE nDay<10
cDate2=cDate2+"零"+SUBSTR(cString2,MOD(nDay,10)*2+1,2)+"日"
CASE nDay<20
cDate2=cDate2+"拾"+SUBSTR(cString2,MOD(nDay,10)*2+1,2)+"日"
OTHERWISE
cDate2=cDate2+"贰拾"+SUBSTR(cString2,MOD(nDay,10)*2+1,2)+"日"
ENDCASE
RETURN cDate2