| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1348 人关注过本帖
标题:转换
只看楼主 加入收藏
sdzhjf
Rank: 1
等 级:新手上路
帖 子:18
专家分:4
注 册:2012-9-7
收藏
得分:0 
测试版主的函数,出现乱码,如果是我程序打错,请指出。

?ConvertCurrencyToChinese(100)
RETURN

*--------------
FUNCTION ConvertCurrencyToChinese(tnCurrency)
  LOCAL lcTemplate, lcCurrency
  LOCAL lcString, lnIndex, lnStart
  LOCAL lcBuffer, lnPos1, lnPos2
  
  IF (VARTYPE(tnCurrency) !='N') .OR. EMPTY(tnCurrency)
      RETURN ""
  ENDIF
  
  lcTemplate = "仟佰拾亿仟佰拾万仟佰拾元角分"
  lcCurrency = "零壹贰叁肆伍陆柒捌玖"
  
  lcBuffer = TRANSFORM(ROUND(tnCurrency,2))
  IF AT(".",lcBuffer)==0
     lcBuffer =lcBuffer+".00"
  ENDIF
  lcBuffer =STUFF(lcBuffer,AT('.',lcBuffer),1,"")
  lcString=""
  lnStart=IIF(RIGHT(lcBuffer,2)!="00",LEN(lcBuffer),LEN(lcBuffer)-2)
  FOR lnIndex=lnStart TO 1 STEP -1
    lnPos1=ASC(SUBSTR(lcBuffer,lnIndex,1))-ASC('0')+1
    lnPos2=LENC(lcTemplate)-LEN(lcBuffer)+lnIndex
    lcString =SUBSTR(lcCurrency,lnPos1,1)+SUBSTRC(lcTemplate,lnPos2,1)+lcString
  NEXT
  RETURN lcString
ENDFUNC
2012-11-20 14:57
sdzhjf
Rank: 1
等 级:新手上路
帖 子:18
专家分:4
注 册:2012-9-7
收藏
得分:0 
希望版主有点负责任的态度,如果是我的程序有错。
已经贴了原程序,你可以试一下。
哪个不合财务格式,请指出,也方便我纠正。
2012-11-20 14:58
sdzhjf
Rank: 1
等 级:新手上路
帖 子:18
专家分:4
注 册:2012-9-7
收藏
得分:0 
*--比较2楼与9楼对比
CLEAR
FOR m_index=1 TO 100
  x=ROUND(RAND()*10000000000,2)
  x1=fp_RMB(x)
  x2=RmbDx(x)
  IF x1<>x2
     ?x
     ?x1
     ?x2
  ENDIF
ENDFOR

*----
PROCEDURE fp_RMB
LPARAMETERS m_Value
IF m_Value>999999999999.99
   RETURN '*****'  && 超出可计算的范围
ENDIF
LOCAL m_Str,m_Return,i,j
m_Str=STR(INT(m_Value*100+0.5),14)  
m_Return=''  && 返回值
FOR i=14 TO 15-LEN(ALLTRIM(m_Str)) STEP -1
  j=VAL(SUBSTR(m_Str,i,1))  && 第i位的数值
  m_Return= IIF(j>0 ,SUBSTR('壹贰叁肆伍陆柒捌玖',j*2-1,2)+SUBSTR('仟佰拾亿仟佰拾万仟佰拾元角分',i*2-1,2),'') ;
          + IIF(j=0 and (i=12 OR i%4=0 AND VAL(SUBSTR(m_Str,i-3,4))>0),SUBSTR('亿万元',i/2-1,2),'') ;
          + IIF(j=0 and VAL(SUBSTR(m_Str,i+1,1))>0 ,'零','') + m_Return
ENDFOR
IF NOT '分'$m_Return
   m_Return=m_Return+IIF( '角'$m_Return ,'零分','整' )
ENDIF
RETURN m_Return

*-----
Procedure RmbDx
  Parameter my_n
  If my_n<0
   FC='负'
  Else
   FC=''
  Endif
  yjf="分角元拾佰仟万拾佰仟亿拾佰仟"
  s_str="[零分][零角][零拾][零佰][零仟][零零]"
  d_str="[零亿][零万][零元]"
  shuzi="零壹贰叁肆伍陆柒捌玖"
  sss=Alltrim(Str(Int(my_n*100), 30))
  dx=""
  For I=1 To Len(sss)
   c=Substr(sss,Len(sss)-I+1,1)
   dx=Substr(shuzi,Val(c)*2+1,2)+Substr(yjf,I*2-1,2)+dx
  Endfor
  dxl=Len(dx)
  myexit=.T.
  Do While .T.
   For ii=1 To dxl Step 2
    If Substr(dx,ii,4)$s_str.And.Len(Substr(dx,ii,4))=4
     myexit=.F.
     Exit
    Else
     myexit=.T.
    Endif
   Endfor
   If myexit=.F.
    dx=Substr(dx,1,ii+1)+Substr(dx,ii+4,dxl-(ii+3))
    dxl=Len(dx)
   Else
    Exit
   Endif
  Enddo
  *
  dxl=Len(dx)
  myexit=.T.
  Do While .T.
   For ii=1 To dxl Step 2
    If Substr(dx,ii,4)$d_str.And.Len(Substr(dx,ii,4))=4
     myexit=.F.
     Exit
    Else
     myexit=.T.
    Endif
   Endfor
   If myexit=.F.
    dx=Substr(dx,1,ii-1)+Substr(dx,ii+2,dxl-(ii+1))
    dxl=Len(dx)
   Else
    Exit
   Endif
  Enddo
  yw_wz=At("亿万",dx)
  If yw_wz>0
   dx=Substr(dx,1,yw_wz+1)+Substr(dx,yw_wz+4,Len(dx)-(yw_wz+3))
  Endif
  If Right(dx,2)="零"
   Do Case
    Case Len(dx)>2
     dx=Left(dx,Len(dx)-2)+'整'
    Case Len(dx)<3
     dx=""
   Endcase
  Endif
  If FC='负'
   dx=FC+(Substr(dx,3,Len(dx)-2))
  Endif
  Return(dx)
ENDPROC


5209406432.70
9楼的结果: 伍拾贰亿零玖佰肆拾万零陆仟肆佰叁拾贰元柒角零分
2楼的结果: 伍拾贰亿零玖佰肆拾万陆仟肆佰叁拾贰元柒角整
 320681107.70
9楼的结果: 叁亿贰仟零陆拾捌万壹仟壹佰零柒元柒角零分
2楼的结果: 叁亿贰仟零陆拾捌万壹仟壹佰零柒元柒角整
4737268299.80
9楼的结果: 肆拾柒亿叁仟柒佰贰拾陆万捌仟贰佰玖拾玖元捌角零分
2楼的结果: 肆拾柒亿叁仟柒佰贰拾陆万捌仟贰佰玖拾玖元捌角整
8062186716.12
9楼的结果: 捌拾亿零陆仟贰佰壹拾捌万陆仟柒佰壹拾陆元壹角贰分
2楼的结果: 捌拾亿陆仟贰佰壹拾捌万陆仟柒佰壹拾陆元壹角贰分
2816168074.50
9楼的结果: 贰拾捌亿壹仟陆佰壹拾陆万捌仟零柒拾肆元伍角零分
2楼的结果: 贰拾捌亿壹仟陆佰壹拾陆万捌仟零柒拾肆元伍角整
3163328098.60
9楼的结果: 叁拾壹亿陆仟叁佰叁拾贰万捌仟零玖拾捌元陆角零分
2楼的结果: 叁拾壹亿陆仟叁佰叁拾贰万捌仟零玖拾捌元陆角整
1711603950.24
9楼的结果: 壹拾柒亿壹仟壹佰陆拾万零叁仟玖佰伍拾元零贰角肆分
2楼的结果: 壹拾柒亿壹仟壹佰陆拾万叁仟玖佰伍拾元贰角肆分
4046828872.52
9楼的结果: 肆拾亿零肆仟陆佰捌拾贰万捌仟捌佰柒拾贰元伍角贰分
2楼的结果: 肆拾亿肆仟陆佰捌拾贰万捌仟捌佰柒拾贰元伍角贰分

大家看哪个是财务指定的格式。
2012-11-20 15:08
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
这样看来2楼的应该更符合要求。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2012-11-20 17:17
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
以下是引用jsyg在2012-11-20 03:07:09的发言:

我逐个测试了一下,没有一个能用的!
需要根据你的实际要求稍作修改程序啊,如:是直接将表中小写数据字段转换成大写数据字段,或者是输入一个小写数据,然后将大写数据显示在屏幕上。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2012-11-20 17:21
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
***********************************************
* fp_RMB   数字->人民币  (最简最优化程序)
***********************************************
*最简最优化的人民币转换程序:
*  ?fp_RMB( 111.23 )      && 结果:壹佰壹拾壹元贰角叁分
*  ?fp_RMB( 100.03 )      && 结果:壹佰元零叁分
*  ?fp_RMB( 1002003.03 )  && 结果:壹佰万零贰仟零叁元零叁分[好象应该为壹佰万贰仟零叁元零叁分]
*  ?fp_RMB( 5000 )        && 结果:伍仟元整
*
*  ?fp_RMB(0.01)          && 结果:壹分
*  ?fp_RMB(0.1)           && 结果:壹角零分{好象应该为壹角整]
*  ?fp_RMB(1)             && 结果:壹元整
*  ?fp_RMB(1001.01)       && 结果:壹仟零壹元零壹分
*  ?fp_RMB(101010100.01)  && 结果:壹亿零壹佰零壹万零壹佰元零壹分
*  ?fp_RMB(10110001010)   && 结果:壹佰零壹亿壹仟万零壹仟零壹拾元整[好象应该为壹佰零壹亿壹仟万壹仟零壹拾元整]

角后面是零分的,应该将“零分”替换为“整”,万之后紧接有千元的无须加“零”。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2012-11-20 17:27
sdzhjf
Rank: 1
等 级:新手上路
帖 子:18
专家分:4
注 册:2012-9-7
收藏
得分:0 
fp_RMB( 1002003.03 )  && 结果:壹佰万零贰仟零叁元零叁分[好象应该为壹佰万贰仟零叁元零叁分]
问财务说:壹佰万(零)贰仟零叁元零叁分  零字是要加的。

fp_RMB(10110001010)   && 结果:壹佰零壹亿壹仟万零壹仟零壹拾元整[好象应该为壹佰零壹亿壹仟万壹仟零壹拾元整]
这个没问,但财务的意思是写零是中间说明有零的意思。

0分不写,改写“整”,是你对。这个程序容易改。
2012-11-20 17:38
sdzhjf
Rank: 1
等 级:新手上路
帖 子:18
专家分:4
注 册:2012-9-7
收藏
得分:0 
http://www.

3、阿拉伯金额数字万位和元位是“0”,或者数字中间连续有几个“0”,万位、元位也是“0”但千位、角位不是“0”时,中文大写金额中可以只写一个零字,也可以不写“零”字,如¥1680.32应写成人民币壹仟陆佰捌拾元零叁角贰分,或者写成人民币壹仟陆佰捌拾元叁角贰分。又如¥107000.53应写成人民币壹拾万柒仟元零伍角叁分,或者写成人民币壹拾万零柒仟元伍角叁分。
两种写法都对。
2012-11-20 17:41
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
1.出乱码是自己抄写和辨识的问题。lcString =SUBSTR(lcCurrency,lnPos1,1)+SUBSTRC(lcTemplate,lnPos2,1)+lcString,这里两个都应是SUBSTRC()函数。
2.“可写”、“可不写”怎么理解,是语文问题,其实准则只有一个,就是“防止涂改的可能性”,用计算机出文本与用人手笔写的区别,是前者不用考虑减省劳动力。

[ 本帖最后由 TonyDeng 于 2012-11-20 21:16 编辑 ]

授人以渔,不授人以鱼。
2012-11-20 21:08
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
以下是引用sdzhjf在2012-11-20 17:41:33的发言:

http://www.
 
3、阿拉伯金额数字万位和元位是“0”,或者数字中间连续有几个“0”,万位、元位也是“0”但千位、角位不是“0”时,中文大写金额中可以只写一个零字,也可以不写“零”字,如¥1680.32应写成人民币壹仟陆佰捌拾元零叁角贰分,或者写成人民币壹仟陆佰捌拾元叁角贰分。又如¥107000.53应写成人民币壹拾万柒仟元零伍角叁分,或者写成人民币壹拾万零柒仟元伍角叁分。  
两种写法都对。
这只能说明大写金额的要求并不规范。金额末尾有效数值不是分的就必须添加整,这一点是大家都认同的,而在亿、万、元这三位上数值为零,紧接其后的数值不为零时大写要不要加零尚没有统一的标准,因此有人就定为两种写法都对。其实我们分析一下也就可以得到答案,在亿、万、元这三个特殊的位置上,如果紧接其后的位(千万、千、角)是零,大写数字加“零”那是非常正常的,但如果这几位数字非零,那大写数字为什么要加零呢?比如100.10元,大写为壹佰元壹角整,若写成壹佰元零壹角整,不觉得这个零是多余的么,因为元之后、角之前并不存在零啊。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2012-11-21 09:42
快速回复:转换
数据加载中...
 
   



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

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