|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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))
复制代码 |
|