题解 | #人民币转换#
人民币转换
https://www.nowcoder.com/practice/00ffd656b9604d1998e966d555005a4b
integer, flo = input().strip().split('.')
num_2_rmb = {'0': '零', '1': '壹', '2': '贰', '3': '叁', '4': '肆', '5': '伍', '6': '陆', '7': '柒', '8': '捌',
'9': '玖'}
rmb_2_num = {}
units = ['元', '拾', '佰', '仟', '万', '拾万', '佰万', '仟万', '亿']
trans_units = ['元'] * len(integer)
# 先获取整数部分的每一位的中文单位
for i in range(len(integer) - 1, -1, -1):
pos = len(integer) - 1 - i
if pos < len(units):
trans_units[i] = units[pos]
else:
tmp_pos = pos % (len(units) - 1)
trans_units[i] = units[tmp_pos] + trans_units[i + tmp_pos]
rmb = ['人民币']
if int(integer) > 0:
if len(integer) >= 6:
# 当整数部分有6位及以上时,可将第四位之后的转换后的单位分为每4个一组
# 每一组中的最后一个单位则是这组的基准单位
# 基准单位用来合并一组中的数字
# 例如:三百万 和 三十万,如果不分组,合并起来是 《三百万三十万》,不符合要求
# 分组后,就可以先提取出基础单位 万,再合并起来就得到 《三百三十万》
base_units = []
end = len(trans_units) - 4
start = end - 4
while start >= 0:
# 这里进行分组
# 分组时保留将每组的最后一位索引保存
base_units.append({end - 1: trans_units[start:end - 1]})
end = start - 1
start = end - 4
base_units.append({end - 1: trans_units[end - 1]})
i = 0
# 每次循环获取cur_base_unit_and_index中的第一个基准单位和索引
# 也就对应着整数部分从左到右第1-4位的基准单位
cur_base_unit_and_index = base_units.pop()
index = list(cur_base_unit_and_index.keys())[0]
cur_base_unit = cur_base_unit_and_index[index]
while i < len(integer):
# 每次循环需判断当前位是否已经超过了目前的基准单位所在的最后一位索引
# 如果已经超过,表示已经循环到了下一个单位分组,需要重新获取基准单位
if i <= index:
r = num_2_rmb[integer[i]]
tu = trans_units[i]
if len(rmb) == 1 and tu.startswith('拾'):
rmb.append(tu[:len(tu)-len(cur_base_unit)])
else:
rmb.append(r)
rmb.append(tu[:len(tu) - len(cur_base_unit)])
i += 1
else:
rmb.append(cur_base_unit)
if base_units:
cur_base_unit_and_index = base_units.pop()
index = list(cur_base_unit_and_index.keys())[0]
cur_base_unit = base_units[index]
else:
break
for i in range(len(integer) - 4, len(integer)):
rmb.append(num_2_rmb[integer[i]])
rmb.append(trans_units[i])
else:
for i in range(len(integer)):
if len(rmb) == 1 and trans_units[i].startswith('拾'):
rmb.append(trans_units[i])
else:
rmb.append(num_2_rmb[integer[i]])
rmb.append(trans_units[i])
if int(flo) == 0:
print(''.join(rmb) + '整')
else:
if flo[0] != '0':
rmb.append(num_2_rmb[flo[0]] + '角')
if flo[1] != '0':
rmb.append(num_2_rmb[flo[1]] + '分')
print(''.join(rmb))
