求pb代码实现金额的小写转换为大写,很多代码都不是这里就是那里有问题,求准确的.

coolbily 2006-10-30 11:29:01
求pb代码实现金额的小写转换为大写,很多代码都不是这里就是那里有问题,求准确的.
...全文
493 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
li_d_s 2006-11-03
  • 打赏
  • 举报
回复
有问题不会自己改啊?什么都求人那还做什么程序
rgb_rgb 2006-11-03
  • 打赏
  • 举报
回复
mark
WorldMobile 2006-11-03
  • 打赏
  • 举报
回复
dawugui 2006-11-02
  • 打赏
  • 举报
回复
小写金额转换成大写金额
深圳:独孤求败 2003-12-03

在很多如打印发票的地方需要打印金额的中文大写,PowerBuilder没有提供这样一个数字转换成金额大写的函数。
我就自己编了一个,在实际使用中效果良好。

程序源代码如下:

int i,lendec,lenint
string numstr,a,b,c,d,bbak

numstr = string(aje,"#0.00")

lenint = len(mid(numstr,1,pos(numstr,'.') - 1)) //获取整数

if right(numstr,2)='00' then //如果是整数
lendec=0 //小数位没有
else
lendec=2 //否则有两位小数
end if

string dxint[13],dxdec[2],sz[13]
string dxstr="万仟佰拾亿仟佰拾万仟佰拾元"
string szstr="零壹贰叁肆伍陆柒捌玖"

for i=1 to 13
dxint[i]=mid(dxstr,26 - i*2+1,2) //反向取
if i < 11 then // 取"零壹贰叁肆伍陆柒捌玖"
sz[i]=mid(szstr,i*2 - 1,2)
else
sz[i]=" " //可以不要
end if
next

dxdec[1]="角"
dxdec[2]="分"

dxstr=" "
for i = 1 to lenint
a = mid(mid(numstr,1,lenint),i,1)
b = sz[integer(a)+1]
c = dxint[lenint - i +1]
if dxstr<>" " then
d = mid(dxstr,len(dxstr) - 1 ,2)
else
d = " "
end if
if b="零" and (d="零" or b=bbak or c="元" or c="万" or c="亿") then
b=""
if a="0" and c<>"元" and c<>"万" and c<>"亿" then
c=""
if (c="元" or c="万" or c="亿") and d="零" and a="0" then
dxstr=mid(dxstr,1,len(dxstr) - 2)
d = mid(dxstr,len(dxstr) - 1,2)
if (c="元" and d="万" or c="万"and d="亿") then
c=""
end if
dxstr=dxstr + b + c
bbak = b
next

for i=1 to lendec
a = mid (mid(numstr,lenint+2,lendec),i,1)
if a="0" and dxdec[i]="分" then
b=""
else
b=sz[integer(a) + 1]
end if
if a<>"0" then
dxstr=dxstr+b+dxdec[i]
else
dxstr=dxstr+b
end if
next

if lendec=0 then
dxstr=dxstr+"整"

return dxstr

tzLYF2012 2006-11-02
  • 打赏
  • 举报
回复
试试我做的.

//====================================================================
// 函数:f_getdxje
//--------------------------------------------------------------------
// 说明:将阿拉伯数字用中文大写数字来表示。
//--------------------------------------------------------------------
// 参数:
// Decimal adc_Je
// <要转换成大写的金额数值>
//--------------------------------------------------------------------
// 返回: (String) 大写金额
//====================================================================

String ls_Result,ls_Flag,ls_NumStr,ls_SubSwfh,ls_SubDxfh
String ls_dxfh='壹贰叁肆伍陆柒捌玖' // 大写符号
String ls_swfh='仟佰拾亿仟佰拾万仟佰拾圆角分' // 数位符号
Integer li_StrLen,li_cnt,li_Pos,li_SubNum,li_NowSW
Boolean lb_LastIsZero

IF isNull(adc_je) THEN RETURN ''

IF adc_je=0 THEN
RETURN ''
ELSEIF adc_je<0 THEN
ls_Flag='负' // 是否是负值
END IF

adc_je=ABS(adc_je)
IF adc_je>999999999999.99 THEN
// MessageBox('错误',' 对不起,金额大写转换功能目前只支持到千亿位的转换,请将金额限制在该范围之内。',Stopsign!)
RETURN ''
END IF

ls_NumStr=Trim(String(adc_je * 100, '#'))
li_StrLen=Len(ls_NumStr)
ls_Swfh=Right(ls_swfh,li_StrLen * 2)

FOR li_cnt=li_StrLen TO 1 STEP -1 // 从分开始取值
li_SubNum=Integer(Mid(ls_NumStr,li_cnt,1))
ls_SubSwfh=Mid(ls_swfh,li_cnt * 2 - 1, 2) // 单位符号
li_NowSW=li_StrLen - li_cnt
IF li_SubNum=0 THEN // 将 0 替换为'零'或'整'
IF lb_LastIsZero THEN // 上一个数值是否也是 0
IF li_NowSW=1 THEN
ls_SubDxfh='整'
ELSE
ls_SubDxfh=''
END IF
ELSE
CHOOSE CASE li_NowSW
CASE 0,2,6,10
ls_SubDxfh='' // 去除分,圆,万,亿位的 0 值
CASE ELSE
ls_SubDxfh='零'
END CHOOSE
END IF

CHOOSE CASE li_NowSW
CASE 2,6,10 // 当前位数是否是 元\万\亿 位
CASE ELSE
ls_SubSwfh = ''
END CHOOSE
ELSE
ls_SubDxfh=Mid(ls_Dxfh,li_SubNum * 2 - 1, 2) // 大写数字符号
END IF

lb_LastIsZero=(li_SubNum=0) // 上一位数值是否为 0
ls_Result=ls_SubDxfh + ls_SubSwfh + ls_Result
NEXT

li_Pos=Pos(ls_Result,'亿万')
IF li_Pos>0 THEN
ls_Result=REPLACE(ls_Result,li_Pos + 2, 2,'') // 移除 "万" 字
END IF

ls_Result = ls_Flag + ls_Result

RETURN ls_Result
woods 2006-11-01
  • 打赏
  • 举报
回复
要那么多钱干吗!哈哈
leyueming 2006-10-31
  • 打赏
  • 举报
回复
收藏
谢良 2006-10-31
  • 打赏
  • 举报
回复
收藏
twilight4037 2006-10-31
  • 打赏
  • 举报
回复
收藏
nettang 2006-10-31
  • 打赏
  • 举报
回复
主要是写程序的都穷人,这辈子没见过这么多钱的~
polestarxu 2006-10-31
  • 打赏
  • 举报
回复
收藏
woods 2006-10-31
  • 打赏
  • 举报
回复
/******************************************************************************/
//函数名: gf_MoneyToString
//功能说明:金额转换成大写
//输入参数:1.data 待转换的金额
//返回值: string 转换后的大写金额
//函数完成:woods
//调用关系:本函数为公共外部函数,可被系统开发的任何地方调用
/******************************************************************************/
constant string ls_bit = "万仟佰拾亿仟佰拾万仟佰拾元角分"
constant string ls_num = "壹贰叁肆伍陆柒捌玖"
long lmax = len( ls_bit ) + 1
string ls_je, ls_dw, ls_result = ''
long ll_len, i, k

ls_je = string( data, "#############.00" )
ll_len = len( ls_je ) - 1
ls_je = replace( ls_je, ll_len - 1, 1, '' )
for i = ll_len to 1 step -1
lmax -= 2
ls_dw = mid( ls_bit, lmax, 2 )
k = long( mid( ls_je, i, 1 ) )
if k = 0 then
choose case ls_dw
case '元','万','亿'
ls_result = ls_dw + ls_result
case '分'
ls_result = '整'
case '角'
if ls_result <> '整' then ls_result = '零' + ls_result
case else
choose case left( ls_result, 2 )
case '万', '亿', '元', '零'
case else
ls_result = '零' + ls_result
end choose
end choose
else
ls_result = mid( ls_num, k * 2 - 1, 2 ) + ls_dw + ls_result
end if
next
return ls_result
coolbily 2006-10-31
  • 打赏
  • 举报
回复
有错的,900000000.00 是"玖亿万元正",亿元以上整数都有错误
fenglinger47073 2006-10-31
  • 打赏
  • 举报
回复
Mark
wei2004 2006-10-31
  • 打赏
  • 举报
回复
学习
youqiong 2006-10-31
  • 打赏
  • 举报
回复

接分

740

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 脚本语言
社区管理员
  • 脚本语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧