【python散装学习系列1】Python实现把数字转成人民币读法

之所以是“散装”学习,是因为我也不能算是一个纯粹的从零开始学习,所以很多自以为简单的内容肯定就跳过。在这种情况下,缺乏系统性,只能叫散装。

今天我们来看一个小问题,问题的描述是这样子的:

问题描述

将一个浮点数转换成人民币读法的字符串.
其中,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))

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值