大写金额算法在网上也有很多,但是试了好多都有这儿那儿的问题,于是本仙穿越时空回到小学,重新审视大写金额的规则,发现了其中各种花里呼哨的大写奥秘,于是本仙施法让计算机瞬间学习大写规则。
本仙采用面向对象仙术施展仙法,念完咒语class一个对象就产生了。
class BigNum(object):
pass
一、给计算机硬塞几颗仙丹,让计算机快速认识阿拉伯数字与中文大写数字的对应关系,同时学会数位汉字和货币单位汉字。
class BigNum(object):
# 定义大写数字字典
dxzd = {
'.':'点',
'0':'零',
'1':'壹',
'2':'贰',
'3':'叁',
'4':'肆',
'5':'伍',
'6':'陆',
'7':'柒',
'8':'捌',
'9':'玖'}
# 定义数位列表
swlb = [
'元','拾','佰','仟','万',
'拾','佰','仟','亿',
'拾','佰','仟']
# 定义货币单位
hbdw = [
'分','角','元']
# 定义初始化方法
def __init__(self,num):
self.dxzd = BigNum.dxzd
self.swlb = BigNum.swlb
self.hbdw = BigNum.hbdw
self.num = num
二、采用仙术让计算机学会四舍五入
python3似乎自带此仙术,可是会发现此仙术不太灵通
>>> print(round(1.055,2))
1.05
自定义四舍五入仙术
# 定义四舍五入方法
def sswr(self,num,n):
# 如果第n-1位上的数值小于5
if int(num*(10**(n+1)))-int(num*(10**(n)))*10 < 5:
# 直接舍弃第n-1位上的值
return int(num*(10**(n)))/(10**(n))
# 否则
else:
# 舍弃第n-1位上的值,并且第n位上的值+1
return int(num*(10**(n))+1)/(10**(n))
三、采用仙术让计算机先学会收据上的那种大写规则
# 大写金额
def dxje(self):
# 金额小写拆分
numlist = list(str(self.sswr(self.num,2)))
# 转换大写数字
numlist = [self.dxzd[i] for i in numlist]
# 连接大写数字
numstr = ''.join(numlist)
# 整数部分连接金额
zsbf = numstr.rpartition('点')[0]
n = len(zsbf)
self.zsdx = ''
for i in range(n):
self.zsdx = self.zsdx + zsbf[i]
# print(zsbf[i],end='')
self.zsdx = self.zsdx + self.swlb[n-i-1]
# print(swlb[n-i-1],end='')
# 小数部分
xsbf = numstr.rpartition('点')[2]
if len(xsbf) == 1:
xsbf += '零'
# print(xsbf)
n = len(xsbf)
self.xsdx = ''
for i in range(n):
self.xsdx = self.xsdx + xsbf[i]
# print(xsbf[i],end='')
self.xsdx = self.xsdx + self.hbdw[n-i-1]
# print(hbdw[n-i-1],end='')
四、采用递归仙术处理零
# 清理重复零值
def xclz(self,numstr):
# 如果没有重复零值
if re.findall('零\w零',numstr) == []:
# 返回结果
if numstr[-1] == '零':
return numstr[0:-1]
else:
return numstr
# 否则
else:
# 递归清除零值
return self.xclz(
numstr.replace(
re.findall(
'零\w零',numstr)[0],'零'))
五、综合施展仙术
import re
class BigNum(object):
# 定义大写数字字典
dxzd = {
'.':'点',
'0':'零',
'1':'壹',
'2':'贰',
'3':'叁',
'4':'肆',
'5':'伍',
'6':'陆',
'7':'柒',
'8':'捌',
'9':'玖'}
# 定义数位列表
swlb = [
'元','拾','佰','仟','万',
'拾','佰','仟','亿',
'拾','佰','仟']
# 定义货币单位
hbdw = [
'分','角','元']
# 定义初始化方法
def __init__(self,num):
self.dxzd = BigNum.dxzd
self.swlb = BigNum.swlb
self.hbdw = BigNum.hbdw
self.num = num
# 定义四舍五入方法
def sswr(self,num,n):
# 如果第n-1位上的数值小于5
if int(num*(10**(n+1)))-int(num*(10**(n)))*10 < 5:
# 直接舍弃第n-1位上的值
return int(num*(10**(n)))/(10**(n))
# 否则
else:
# 舍弃第n-1位上的值,并且第n位上的值+1
return int(num*(10**(n))+1)/(10**(n))
# 清理重复零值
def xclz(self,numstr):
# 如果没有重复零值
if re.findall('零\w零',numstr) == []:
# 返回结果
if numstr[-1] == '零':
return numstr[0:-1]
else:
return numstr
# 否则
else:
# 递归清除零值
return self.xclz(
numstr.replace(
re.findall(
'零\w零',numstr)[0],'零'))
# 大写金额
def dxje(self):
# 金额小写拆分
numlist = list(str(self.sswr(self.num,2)))
# 转换大写数字
numlist = [self.dxzd[i] for i in numlist]
# 连接大写数字
numstr = ''.join(numlist)
# 整数部分连接金额
zsbf = numstr.rpartition('点')[0]
n = len(zsbf)
self.zsdx = ''
for i in range(n):
self.zsdx = self.zsdx + zsbf[i]
# print(zsbf[i],end='')
self.zsdx = self.zsdx + self.swlb[n-i-1]
# print(swlb[n-i-1],end='')
# print(self.zsdx)
# 整数部分清除零值
li = ['万','亿']
for i in li:
self.zsdx = self.zsdx.replace(i,'&')
numlist = self.zsdx[0:-1].split('&')
numlist = [self.xclz(i) for i in numlist]
# print(numlist)
# 整数部分加回单位
n = len(numlist)
li = ['元','万','亿']
self.zsdx = ''
for i in range(n):
self.zsdx = self.zsdx + numlist[i]
# print(numlist[i],end='')
self.zsdx = self.zsdx + li[n-i-1]
# print(li[n-i-1],end='')
# print(self.zsdx)
# # 清理零值后面的数位
li = ['零仟','零佰','零拾']
for i in li:
self.zsdx = self.zsdx.replace(i,'零')
self.zsdx = self.zsdx.replace('亿万','亿零')
# print(self.zsdx)
# 小数部分
xsbf = numstr.rpartition('点')[2]
if len(xsbf) == 1:
xsbf += '零'
# print(xsbf)
n = len(xsbf)
self.xsdx = ''
for i in range(n):
self.xsdx = self.xsdx + xsbf[i]
# print(xsbf[i],end='')
self.xsdx = self.xsdx + self.hbdw[n-i-1]
# print(hbdw[n-i-1],end='')
if self.xsdx == '零角零分':
self.xsdx = '整'
elif self.xsdx[-2:] == '零分':
self.xsdx = self.xsdx[0:2]+'整'
elif self.xsdx[0:2] == '零角':
self.xsdx = '零'+self.xsdx[-2:]
def __str__(self):
return self.zsdx + self.xsdx
def rmbdx(num):
bignum = BigNum(num)
bignum.dxje()
return bignum.zsdx + bignum.xsdx
def main():
print(rmbdx(5600030800.9896))
print(rmbdx(5000030800.9896))
if __name__ == '__main__':
main()
output:
伍拾陆亿零叁万零捌佰元玖角玖分
伍拾亿零叁万零捌佰元玖角玖分
这是本仙在CSDN上首次施法,望各位也使用仙法点赞加转发加收藏加测试加质疑。本仙会不定期回复。