之所以是“散装”学习,是因为我也不能算是一个纯粹的从零开始学习,所以很多自以为简单的内容肯定就跳过。在这种情况下,缺乏系统性,只能叫散装。
今天我们来看一个小问题,问题的描述是这样子的:
问题描述
将一个浮点数转换成人民币读法的字符串.
其中,0~9 的人民币读法分别为 零 壹 贰 叁 肆 伍 陆 柒 捌 玖
各个单位分别为 拾 佰 仟 萬 亿
简单起见,这道题只要求转换一万亿以下的数.
同时也为了简单起见(其实是为了避免浮点数造成的不确定尾数),这道题的小数部分只要求精确到小数点后两位.(人民币计量也只需要计量到小数点后两位)
给出几个样例:
1234 壹仟贰佰叁拾肆
1234.56 壹仟贰佰叁拾肆点伍陆
12340000.98 壹仟贰佰叁拾肆萬点玖捌
120000300004.09 壹仟贰佰亿零叁拾萬零肆点零玖
问题难点
- 整数和小数部分如何分离
- 如何指定每四位的单位
- 有零位时如何去掉重复的零(如样例4),某四位全是零时,如何跳过整个四位(如样例3)
- 小数部分如何处理
样例代码1
#!/usr/bin/python
# -*- coding: UTF-8 -*-
def divide(num):
"""
把一个浮点数分解成整数部分和小数部分字符串
num是需要被分解的浮点数
返回分解出来的整数部分和小数部分
第一个数组元素是整数部分,第二个数组元素是小数部分
"""
# 将一个浮点数强制类型转换为int类型,即得到它的整数部分
integer = int(num)
fraction = round((num - integer)*100)
# 下面把整数转换成字符串
return str(integer), str(fraction)
han_list = ["零", "壹", "贰", "叁", "肆",
"伍", "陆", "柒", "捌", "玖"]
unit_list = ["拾", "佰", "仟"]
def four_to_hanstr(num_str):
"""
把一个4位的数字字符串变成汉字字符串
num_str是需要被转换的4位数字字符串
返回4位数字字符串被转换成汉字字符串
"""
result = ""
num_len = len(num_str)
# 依次遍历数字字符串的每一个数字
for i in range(num_len):
# 把字符串转换成数值
num = int(num_str[i])
# 如果不是最后一位数字,而且数字不是零,则需要添加单位(仟、佰、拾)
if i != num_len - 1 and num != 0:
result += han_list[num] + unit_list[num_len - 2 - i]
# 否则不要添加单位
else:
# 如果不是头一位,且前一位已经有零,则不需要当位的零
if i > 0 and int(num_str[i-1]) == 0 and num == 0:
continue
else:
result += han_list[num]
return result.rstrip("零")
def integer_to_str(num_str):
"""
把数字字符串上变成汉字字符串
num_str是需要被转换的数字字符串
返回数字字符串被转换成汉字字符串
:param num_str: 数字字符串
:return: 汉字字符串
"""
str_len = len(num_str)
if str_len > 12:
print('数字太大了,翻译不了')
return
# 如果大于8位,则包含单位“亿”
elif str_len > 8:
return four_to_hanstr(num_str[:-8]) + "亿" + \
four_to_hanstr(num_str[-8:-4]) + \
("" if len(four_to_hanstr(num_str[-8:-4])) == 0 else "萬") + \
four_to_hanstr(num_str[-4:])
# 如果大于四位,则包含单位“万”
elif str_len > 4:
return four_to_hanstr(num_str[:-4]) + "萬" + \
four_to_hanstr(num_str[-4:])
else:
return four_to_hanstr(num_str)
def fraction_to_hanstr(num_str):
if len(num_str) < 2 and int(num_str) == 0:
return ""
elif len(num_str) < 2:
num = int(num_str)
return "点零" + han_list[num]
else:
frac_str = "点"
for num in num_str:
num = int(num)
frac_str += han_list[num]
return frac_str.rstrip('零')
num1 = float(input("请输入一个浮点数:"))
# 测试把一个浮点数分解成整数部分和小数部分
integer1, fraction1 = divide(num1)
# 测试把一个4位的数字字符串变成汉字字符串
print(integer_to_str(integer1) + fraction_to_hanstr(fraction1))