马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
以下是一段将数字转换为金额大写的Python代码,遇到一个特殊的问题,就是当小数部分是51的时候,会出现转换为伍角贰分或者伍角的错误,请大神指点。
from decimal import Decimal, getcontext
getcontext().prec = 50
def num_to_rmb(num):
# 定义数字对应的大写汉字
num_dict = {0: '零', 1: '壹', 2: '贰', 3: '叁', 4: '肆', 5: '伍', 6: '陆', 7: '柒', 8: '捌', 9: '玖'}
# 定义单位
unit_dict = {0: '', 1: '拾', 2: '佰', 3: '仟', 4: '万', 8: '亿', 12: '万亿'}
# 分离整数部分和小数部分
num = Decimal(num) #保证数值精度
num_str = str(num)
if '.' in num_str:
integer_part, decimal_part = num_str.split('.')
# 确保小数部分是两位长度
decimal_part = decimal_part.ljust(2, '0')
else:
integer_part = num_str
decimal_part = '00'
# 处理整数部分
integer_result = ""
if integer_part != "0":
length = len(integer_part)
group_count = (length + 3) // 4 # 计算有多少个 4 位一组
zero_between_groups = False
for i in range(group_count):
start = max(0, length - (i + 1) * 4)
end = length - i * 4
group = integer_part[start:end]
group_length = len(group)
group_result = ""
zero_flag = False
non_zero_digit_in_group = False
for j, digit in enumerate(group):
digit = int(digit)
if digit == 0:
zero_flag = True
else:
non_zero_digit_in_group = True
if zero_flag:
group_result += "零"
zero_flag = False
group_result += num_dict[digit] + unit_dict[group_length - j - 1]
if group_result.endswith("零"):
group_result = group_result.rstrip("零")
if non_zero_digit_in_group:
if zero_between_groups and integer_result and integer_result[-1] != "零":
integer_result += "零"
integer_result = group_result + unit_dict[i * 4] + integer_result
zero_between_groups = False
else:
zero_between_groups = True
if integer_result.endswith("零"):
integer_result = integer_result.rstrip("零")
# 处理小数部分
decimal_result = ""
if decimal_part != "00":
jiao = int(decimal_part[0])
fen = int(decimal_part[1])
if jiao != 0:
decimal_result = num_dict[jiao] + "角"
if fen != 0:
decimal_result += num_dict[fen] + "分"
else:
decimal_result += "整"
elif fen != 0:
decimal_result = num_dict[fen] + "分"
# 拼接整数和小数部分结果
if decimal_result:
if integer_result:
integer_result += "元"
if integer_result[-1] != "零" and decimal_result and not decimal_result.startswith(num_dict[0]) and int(decimal_part[0]) == 0:
result = integer_result + "零" + decimal_result
else:
result = integer_result + decimal_result
else:
result = decimal_result
else:
if integer_result:
result = integer_result + "元整"
else:
result = "零元整"
return result
print(num_to_rmb(123456789876543.51))
print(num_to_rmb(10302450789002.51)) #输出错误???
# print(num_to_rmb(1000010.01))
# print(num_to_rmb(100.50))
# print(num_to_rmb(10.50))
# print(num_to_rmb(10.02))
# print(num_to_rmb(10.00))
# print(num_to_rmb(0.5))
# print(num_to_rmb(0.12))
# print(num_to_rmb(0.01))
# print(num_to_rmb(0))
|