函数:将金额数字转换为汉字大写形式
用法:str = cDigit(x)
参数:x 双精度的浮点数,输入
参数:x 双精度的浮点数,输入
返回:cDigit 输出的会计用金额大写字符串
注意:返回空格表示输入数值越界,定义域:0<x<=999999999999.99
作者:szw_sh@163.com
Program www_fcode_cn
Implicit None
Character(len=56) :: cDigit
write(*,*) cDigit( 314223243431.34d0 )
End Program www_fcode_cn
character(Len=56) Function cDigit(x)
!函数:将金额数字转换为汉字大写形式
!用法:str = cDigit(x)
!参数:x 双精度的浮点数,输入
!返回:cDigit 输出的会计用金额大写字符串
!注意:返回空格表示输入数值越界,定义域:0<x<=999999999999.99
!作者:szw_sh@163.com
Implicit None
Real(Kind=8) x ! 输入数值定义为双精度型
Character(len=15) :: h ! x的临时字符变量
Integer :: np ! cDigit位置标记
Character(len=*) , parameter :: number='零壹贰叁肆伍陆柒捌玖'
Character(len=2) , parameter :: cnp_list(8) = ['仟','百','拾','亿','万','圆','角','分']
Integer , parameter :: np_list(14) = [1,2,3,4,1,2,3,5,1,2,3,6,7,8]
!//千亿,百亿,十亿,亿,千万,百万,十万,万,千,百,十,圆,角,分
integer :: i , k
cDigit = ' '
If ( x>999999999999.99D0 .Or. x<=0.0d0 ) Return ! 定义域检查
Write (h, '(f15.0)') x*100.0d0 ! 将小数2位一并归入整数,x转为字符形式,千分位自动舍入
If (h(14:14)=='0') h(14:14) = ' ' ! 自右向左检查为0的位(从第14位起,第15位为小数点):
Do i = 13, 1, -1 ! 尾部为0的以空格标记,大写中忽略
If (h(i:i)/='0') Cycle ! 连续的0只保留一个,其余标记为空格
If (index('$0 ',h(i+1:i+1))/=0) h(i:i) = ' ' ! 亿、万、千亿、千万位及个位的0必须在大写时表示,标记为$
If (mod(i,4)==0) h(i:i) = '$' ! 即位置i=4,8,12时
End Do
np = 1
Do i = 1, 14 ! 转换为汉字大写形式
If (h(i:i)==' ') Cycle ! 空格位忽略
If (h(i:i)/='$') Then ! 数字位转换为汉字大写
k = ichar(h(i:i)) - ichar('0')
cDigit(np:np+1) = number(2*k+1:2*k+2)
np = np + 2
End If
If (h(i:i)=='0') Cycle ! 遇0时略去数字单位标注
If ( i == 8 .and. cDigit(np-2:np-1)=='亿') cycle ! 万位,若亿位与万位之间均为0,则该位不标注
cDigit(np:np+1) = cnp_list(np_list(i))
np = np + 2
End Do
End Function cDigit



