免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8811 | 回复: 3
打印 上一主题 下一主题

金额小写转大写 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-06-12 19:50 |只看该作者 |倒序浏览
参考 csdn 上方小庆 写delphi版的 金额转换函数
功能将小于十万亿元的小写金额转换为大写
代码

  1. def IIf( b, s1, s2):

  2.     if b:

  3.         return s1

  4.     else:

  5.         return s2



  6. def num2chn(nin=None):

  7.         cs =
  8. ('零','壹','贰','叁','肆','伍','陆','柒','捌','玖','◇','分','角','圆','拾','佰','仟',
  9. '万','拾','佰','仟','亿','拾','佰','仟','万')

  10.         st = ''; st1=''

  11.         s = '%0.2f' % (nin)       

  12.         sln =len(s)

  13.         if sln >; 15: return None

  14.         fg = (nin<1)



  15.         for i in range(0, sln-3):

  16.                 ns = ord(s[sln-i-4]) - ord('0')

  17.                 st=IIf((ns==0)and(fg or (i==8)or(i==4)or(i==0)), '', cs[ns])\

  18.             + IIf((ns==0)and((i<>;8)and(i<>;4)and(i<>;0)or fg
  19. and(i==0)),'', cs[i+13])\

  20.             + st

  21.                 fg = (ns==0)

  22.         fg = False

  23.         for i in [1,2]:

  24.                 ns = ord(s[sln-i]) - ord('0')

  25.                 st1 = IIf((ns==0)and((i==1)or(i==2)and(fg or (nin<1))), '', cs[ns])\

  26.               + IIf((ns>;0), cs[i+10], IIf((i==2) or fg, '', '整'))\

  27.               + st1

  28.                 fg = (ns==0)

  29.         st.replace('亿万','万')

  30.         return IIf( nin==0, '零', st + st1)

  31. if __name__ == '__main__':

  32.     num = 12340.1

  33.     print num

  34.     print num2chn(num)
复制代码

论坛徽章:
0
2 [报告]
发表于 2005-06-12 21:46 |只看该作者

金额小写转大写

good
收藏了

论坛徽章:
0
3 [报告]
发表于 2008-12-13 21:16 |只看该作者
参照 csdn:僵哥 的C/C++版本改成的python版本
个人觉得僵哥的C/C++版是比较完美的版本。

#!/usr/bin/env python
# -*- encoding: UTF-8 -*-
# Filename: amt2chn.py

def amt2chn(amt):
   
    mnUnit = ("分", "角", "元"
    fixWord = ("整", "负", "人民币"
    chUnit = ("拾", "佰", "仟", "万", "拾", "佰", "仟", "亿"
    chCapt = ("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"
   
    chn = fixWord[2]
    iLen = 0
    iLen2 = 0
    iNum = 0
    iAdd0 = 0

    s_amt = str(int(amt*100.0))
    iLen = len(s_amt)
   
    if ( amt < 0.00 ):
        chn += fixWord[1]
        s_amt = s_amt[1:]
        iLen -= 1
   
    for i in range(iLen):
        iNum = int(s_amt)
        iLen2 = iLen - i - 1
        if ( 0 == iNum):
            if ( (iLen2-2)%4==0 and (iLen2-3)>0 and ((iLen2>= or iAdd0<3) ):
                chn += chUnit[(iLen2-3)%8]
            iAdd0 += 1
        else:
            if ( iLen>1 and iLen2==0 and iAdd0>0 ):
                chn += chCapt[0]
            if ( (iAdd0 and iLen2>=2) and
                 ((iLen2-1)%4!=0) or (iAdd0>=4 and (iLen2-1)>0) ):
                chn += chCapt[0]
            chn += chCapt[iNum]
            iAdd0 = 0
        if ( (iAdd0<1) or (iLen2==2) ):
            if( iLen2>=3 ):
                chn += chUnit[(iLen2-3)%8]
            else:
                chn += mnUnit[(iLen2)%3]
   
    l_chn = len(chn) - len(fixWord[2])
    l_chn = int(l_chn/1.5)
    if( l_chn+(amt<0.00 and (-2) or 0) == 0 ):
        chn += chCapt[0]
        chn += mnUnit[2]
        chn += fixWord[0]
    elif ( s_amt[iLen-1] == '0' ):
        chn += fixWord[0]
   
    return chn

if __name__ == '__main__':
    amt1 = 1231.21
    print amt1, ':', amt2chn(amt1)


用wxpython做了GUI


应用程序和源代码请到:http://weaver.blogbus.com/logs/32266348.html  下载

论坛徽章:
0
4 [报告]
发表于 2008-12-14 08:30 |只看该作者
2005年的帖子都被爆出来了啊~~~~恰巧我写的第一个python程序就是小写转大写的~
# coding=gbk
# 人民币小写金额转大写,万亿以下
# 根据人民币金额转换规则,某些位置加‘零’与不加‘零均正确
# 如"100075"===="人民币壹仟元柒角伍分"
#   "100075"===="人民币壹仟元零柒角伍分"
# 均为正确写法
#
# My Blog:http://www.xsmile.net

import string

class Translater:
    Number={'1':'壹','2':'贰','3':'叁',\
            '4':'肆','5':'伍','6':'陆',\
            '7':'柒','8':'捌','9':'玖'}
    Unit=('仟','佰','拾','亿','仟','佰','拾','万','仟','佰','拾','元','角','分')
    RMB=[]
    # 查 零 重复标志位。
    temp=1
    def __init__(self,Cash='0'):
          """数字串校验,去除串首‘0’字符
             其余譬如是否为数字及字符长度等校验放入GUI端
          "
""
          self.RMB=list(Cash)
          while len(self.RMB)>0 and self.RMB[0]=='0':
              self.RMB.remove('0')

    def turn(self):
        """数字串书写格式转换:
           如 123455===》1,234.55
        "
""
        RMBTurn=self.RMB[:]
        if len(RMBTurn)>2:
            RMBTurn.insert(-2,'.')
        if len(RMBTurn)>6:
            RMBTurn.insert(-6,',')
        if len(RMBTurn)>10:
            RMBTurn.insert(-10,',')
        if len(RMBTurn)>14:
            RMBTurn.insert(-14,',')
        if len(RMBTurn)>18:
            RMBTurn.insert(-18,',')
        return RMBTurn

    def printer(self):
          """转换程序,自右向左进行转换"""
          Result=[]
          for x,y in zip(self.RMB,self.Unit[-(len(self.RMB)):]):
              if x=='0':
                  if y=='元' or y=='万' or y=='亿':
                      if self.temp==0:
                          Result.pop()
                      Result.append(y)
                      self.temp=1
                  elif self.temp==0:
                      pass
                  else:
                      Result.append('零')
                      self.temp=0
              else:
                  self.temp=1
                  Result.append(self.Number.get(x,'零')+y)
          if self.temp==0:
              Result.pop()
              Result.append('正')
          return '人民币'+"".join(Result)

if __name__=="__main__":
    d=Translater('100075')
    print d.printer()


wxpthon写的一个简易界面,移步到这里

[ 本帖最后由 xsmile 于 2008-12-14 08:36 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP