小写金额转大写金额
本帖最后由 miracle2016 于 2022-7-6 11:59 编辑import re
dictionary = {'0': '零', '1': '壹', '2': '贰', '3': '叁', '4': '肆', '5': '伍', '6': '陆', '7': '柒', '8': '捌', '9': '玖'}
level1 = {1: '圆', 2: '万', 3: '亿', 4: '兆'}
level2 = {2: '拾', 3: '佰', 4: '仟'}
level3 = {1: '角', 2: '分'}
class DecimalToChn:
def __init__(self, que_decimal):
self.que_decimal = str(que_decimal)
self.num_float = None
self.num_integer = None
self.pre = []
self.integer_chn = []
self.float_chn = []
def query(self):
'''
验证数字,整数大于16位数,小数多余小数点后面2位数的全部弄成0
:return:
'''
if "." not in self.que_decimal:
self.que_decimal = self.que_decimal + "." + "0"
if len(self.que_decimal.split('.')) <= 16 and len(self.que_decimal.split('.')) <= 2:
return self.que_decimal
else:
return 0
def split_num(self):
"""
将进来的数字拆成整数部分跟小数部分
:return:
"""
number = self.query()
self.num_integer, self.num_float = number.split('.')
def process_integer(self):
"""
处理整数部分
:return:
"""
length = len(self.num_integer)
# 整数部分小于千位的
if length <= 4:
self.pre.append(self.num_integer)
# print("整数部分小于4位的:",self.pre)
else:
# 整数部分大于千位的
extra = length % 4
if extra != 0:
self.pre.append(self.num_integer)
length = length - extra
start, end = extra, 4 + extra
else:
start, end = 0, 4
while length:
self.pre.append(self.num_integer)
start += 4
end += 4
length -= 4
# print("整数部分大于4位的:", self.pre)
def per_conver(self, num):
length = len(num)
flag = True
# Special
# deal with '0000'
if num == '0000':
return ''
# deal with '1000'
if num == '000':
return dictionary] + level2
# Normal
res, p = '', length
for i in range(0, length):
# deal with prefix is '0'
if (res == '' or res == dictionary]) and num == '0':
# only one '0'
if flag:
res += dictionary]
flag = False
p -= 1
continue
# deal with '1001'
if i + 1 < length and num == '0' and num == '0':
p -= 1
continue
# deal with '1010' '1110'
if i == length - 1 and num == '0':
continue
res += dictionary]
if p > 1 and num != '0':
res += level2
p -= 1
return res
def convert_integer(self):
self.split_num()
self.process_integer()
# print(self.pre)
p = len(self.pre)
for i in self.pre:
per_res = self.per_conver(i)
self.integer_chn += per_res
if p > 0 and per_res != '':
self.integer_chn += level1
else:
self.integer_chn += level1
p -= 1
def convert_float(self):
# print(self.num_float)
if self.num_float == "00":
self.num_float = ""
for i in range(0, len(self.num_float)):
self.float_chn += dictionary]
if (i + 1) <= 2:
self.float_chn += level3
def convert(self):
self.convert_integer()
self.convert_float()
# print(self.float_chn)
if self.float_chn:
return ''.join(self.integer_chn + self.float_chn)+"整"
return ''.join(self.integer_chn) +"整"
def re_num(float_number):
value = re.compile(r'^[-+]?+\.?+$')
result = value.match(float_number)
return result
if __name__ == '__main__':
while True:
num = input("请输入您想要转的金额:")
result = re_num(num)
if result:
print(DecimalToChn(num).convert())
continue
print("你输入的不是数字,请重新输入")
搜狗输入法下,输入字母V,然后直接输入数字就可以转换成大写金额了。 alinwei 发表于 2022-7-6 12:13
搜狗输入法下,输入字母V,然后直接输入数字就可以转换成大写金额了。
{:1_893:}嗯,这个是我自己做的djangao合同管理系统里面的一个小脚本,拿出来共享一下 lilukang12345 发表于 2022-7-6 17:42
=IF(ROUND(A1,2)=0,"",IF(A1=1,TEXT(INT(ROUND(ABS(A1),2)),"")&"元","")&SUBSTITUTE(SUBSTITUTE(T ...
经验证:正确 =IF(ROUND(A1,2)=0,"",IF(A1<0,"负","")&IF(ABS(A1)>=1,TEXT(INT(ROUND(ABS(A1),2)),"")&"元","")&SUBSTITUTE(SUBSTITUTE(TEXT(RIGHT(RMB(A1,2),2),"0角0分;;整"),"零角",IF(A1^2<1,,"零")),"零分","整")) 本帖最后由 paypojie 于 2022-7-6 12:11 编辑
粗略的看了一下 感觉写的还行 1000000000000000 转的了 10000000000000000 就转不了 能简单点吗? paypojie 发表于 2022-7-6 12:02
粗略的看了一下 感觉写的还行 1000000000000000 转的了 10000000000000000 就转不了
整数大于16位不转,太麻烦了一般也用不上 wycdd 发表于 2022-7-6 12:12
能简单点吗?
您可以提个建议,我也觉得好复杂。但是我想不到怎么简单了 miracle2016 发表于 2022-7-6 12:14
整数大于16位不转,太麻烦了一般也用不上
也对 一般来说 实际上不会用这么大的数字转 不过开头这种写法 有点熟悉{:301_978:} miracle2016 发表于 2022-7-6 12:14
您可以提个建议,我也觉得好复杂。但是我想不到怎么简单了
暂时也没想到啥好的建议:lol 万亿以上的读法解析其实都差不多,可以缩减为一个,然后就是针对中间连续0的处理,和末尾纯0的处理