关于使用python简单将账本金额转化为大写中文数字
缘由实习的地方要求将账本金额转换为中文大写,我又不想一个个手打,网上能直接找到的也只支持整数转换,就根据自己的需要写了一小段,置此以作记录
def get_sdigit(num, p):
return int(num / pow(10, p)) % 10
def get_max_pos(number):
return len(str(int(number))) + len(str(int(number))) % 4 + 1
class CNumber:
cdict = {}
gdict = {}
xdict = {}
def __init__(self):
self.cdict = {0: u'', 1: u'拾', 2: u'佰', 3: u'仟'}
self.xdict = {0: '分', 1: '角', 2: u'元', 3: u'万', 4: u'亿', 5: u'兆'} # 数字标识符
self.gdict = {0: u'零', 1: u'壹', 2: u'贰', 3: u'叁', 4: u'肆', 5: u'伍', 6: u'陆', 7: u'柒', 8: u'捌', 9: u'玖'}
def tsf(self, number):
cdata = []
cdata.append(get_sdigit(number, -2))
cdata.append(get_sdigit(number, -1))
mark = 0
for i in range(0, get_max_pos(number)):
if mark == 0:
temp = []
temp.append(get_sdigit(number, i))
mark += 1
elif mark == 1:
temp.append(get_sdigit(number, i))
mark += 1
elif mark == 2:
temp.append(get_sdigit(number, i))
mark += 1
elif mark == 3:
temp.append(get_sdigit(number, i))
mark = 0
cdata.append(temp)
return self.to_String(cdata)
def to_String(self, nList):
S = '' # 初始化用的S,防止小数部分为空
# 下面两个if是用来加上小数部分的
if nList[0] != 0:
S = self.gdict.get(nList[0]) + self.xdict.get(0)
if nList[1] != 0:
S = self.gdict.get(nList[1]) + self.xdict.get(1) + S
if nList[0] == 0 and nList[1] == 0:
S = '整' + S
for i in range(2, len(nList)):
mark = 0
for num in nList[i]:
if num == 0:
mark += 1
if mark != 4 or i == 2:
S = self.xdict.get(i) + S # 加上单位(元万亿。。。)
for j in range(0, 4):
if i != len(nList) - 1:
if nList[i][j] != 0:
S = self.gdict.get(nList[i][j]) + self.cdict.get(j) + S
# 逻辑判断,每四个单位哪些情况会出现零
# 基本逻辑为,同阶内,小于自己的一定存在非0,而自己的上一位一定非0
elif (j == 1 and nList[i][0] != 0 and nList[i][2] != 0)
or (j == 2 and (nList[i][1] != 0 or nList[i][0] != 0) and nList[i][3] != 0)
or (j == 3 and (nList[i][2] != 0 or nList[i][1] != 0 or nList[i][0] != 0)):
S = self.gdict.get(nList[i][j]) + S
else:
if nList[i][j] != 0:
S = self.gdict.get(nList[i][j]) + self.cdict.get(j) + S
elif j == 1 and nList[i][0] != 0 and nList[i][2] != 0:
S = self.gdict.get(nList[i][j]) + S
return S
这里是简单测试用的
if __name__ == '__main__':
test = CNumber()
print(test.tsf(1100000000))



