金额小写转大写

金额小写转大写

参考 csdn 上方小庆 写delphi版的 金额转换函数
功能将小于十万亿元的小写金额转换为大写
代码

[Copy to clipboard] [ - ]
CODE:
def IIf( b, s1, s2):

    if b:

        return s1

    else:

        return s2



def num2chn(nin=None):

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

        st = ''; st1=''

        s = '%0.2f' % (nin)       

        sln =len(s)

        if sln >; 15: return None

        fg = (nin<1)



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

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

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

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

            + st

                fg = (ns==0)

        fg = False

        for i in [1,2]:

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

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

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

              + st1

                fg = (ns==0)

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

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

if __name__ == '__main__':

    num = 12340.1

    print num

    print num2chn(num)

good
收藏了
参照 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  下载
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写的一个简易界面,移步到这里