2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 数字金额转换为大写金额python_python 实现金额数字转成大写

数字金额转换为大写金额python_python 实现金额数字转成大写

时间:2018-10-25 06:10:26

相关推荐

数字金额转换为大写金额python_python 实现金额数字转成大写

def cncurrency(value, capital=True, prefix=False, classical=None):'''参数:

capital: True 大写汉字金额

False 一般汉字金额

classical: True 元

False 圆

prefix: True 以'人民币'开头

False, 无开头'''

if notisinstance(value, (Decimal, str, int)):

msg= '''由于浮点数精度问题,请考虑使用字符串,或者 decimal.Decimal 类。

因使用浮点数造成误差而带来的可能风险和损失作者概不负责。'''warnings.warn(msg, UserWarning)#默认大写金额用圆,一般汉字金额用元

if classical isNone:

classical= True if capital elseFalse#汉字金额前缀

if prefix isTrue:

prefix= '人民币'

else:

prefix= ''

#汉字金额字符定义

dunit = ('角', '分')ifcapital:

num= ('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖')

iunit= [None, '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰', '仟', '万', '拾', '佰', '仟']else:

num= ('〇', '一', '二', '三', '四', '五', '六', '七', '八', '九')

iunit= [None, '十', '百', '千', '万', '十', '百', '千', '亿', '十', '百', '千', '万', '十', '百', '千']ifclassical:

iunit[0]= '元' if classical else '圆'

#转换为Decimal,并截断多余小数

if notisinstance(value, Decimal):

value= Decimal(value).quantize(Decimal('0.01'))#处理负数

if value <0:

prefix+= '负' #输出前缀,加负

value = - value #取正数部分,无须过多考虑正负数舍入

#assert - value + value == 0

#转化为字符串

s =str(value)if len(s) > 19:raise ValueError('金额太大了,不知道该怎么表达。')

istr, dstr= s.split('.') #小数部分和整数部分分别处理

istr = istr[::-1] #翻转整数部分字符串

so = [] #用于记录转换结果

#零

if value ==0:return prefix + num[0] +iunit[0]

haszero= False #用于标记零的使用

if dstr == '00':

haszero= True #如果无小数部分,则标记加过零,避免出现“圆零整”

#处理小数部分

#分

if dstr[1] != '0':

so.append(dunit[1])

so.append(num[int(dstr[1])])else:

so.append('整') #无分,则加“整”

#角

if dstr[0] != '0':

so.append(dunit[0])

so.append(num[int(dstr[0])])elif dstr[1] != '0':#so.append(num[0]) # 无角有分,添加“零”

#haszero = True # 标记加过零了

pass

#无整数部分

if istr == '0':if haszero: #既然无整数部分,那么去掉角位置上的零

so.pop()

so.append(prefix)#加前缀

so.reverse() #翻转

return ''.join(so)#处理整数部分

for i, n inenumerate(istr):

n=int(n)if i % 4 == 0: #在圆、万、亿等位上,即使是零,也必须有单位

if i == 8 and so[-1] == iunit[4]: #亿和万之间全部为零的情况

so.pop() #去掉万

so.append(iunit[i])if n == 0: #处理这些位上为零的情况

#if not haszero: # 如果以前没有加过零

#so.insert(-1, num[0]) # 则在单位后面加零

#haszero = True # 标记加过零了

pass

else: #处理不为零的情况

so.append(num[n])

haszero= False #重新开始标记加零的情况

else: #在其他位置上

if n != 0: #不为零的情况

so.append(iunit[i])

so.append(num[n])

haszero= False #重新开始标记加零的情况

else: #处理为零的情况

if not haszero: #如果以前没有加过零

#so.append(num[0])

#haszero = True

pass

#最终结果

so.append(prefix)

so.reverse()return ''.join(so)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。