首页 编程教程正文

对于《疯狂python》书P86 数字转人民币代码<完善对于整数和小数的分离>

piaodoo 编程教程 2020-02-22 22:12:23 1149 0 python教程

本文来源吾爱破解论坛

本帖最后由 Rui. 于 2019-12-9 09:39 编辑

本人一个在校大学生,自学python,本程序还有很多地方需要完善,需要改正的地方希望大家积极指出
<第一次发帖,望谅解>

希望能得到各位志同道合的朋友的更正,谢谢!


def divide(num):
    """
    用split函数将浮点数以‘.’为界限拆分为
        整数部分(integer)
        小数部分(fraction)
    :param num:
    :return:
    """
    integer, fraction = str(num).split('.')
    result = integer_to_str(integer) + fractional_part(fraction)
    return result

以上是以前对于整数部分和小数部分处理的函数代码,在输入整数时会出现‘零’的现象

===============================================================

下面的新代码是我用正则表达式修改后的,修复了以上的现象

import re
han_list = ['零','壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
unit_list = ['拾', '佰', '仟']

def divide(num):
    """
    用split函数将浮点数以‘.’为界限拆分为
        整数部分(integer)
        小数部分(fraction)
    :param num:
    :return:
    """
    num = str(num)
    # 通过正则表达式对整数部分进行提取
    integer = re.match('^\d*', num)
    # 通过调用正则的sub方法将整数部分和小数点替换成空字符(去除),留下小数部分
    fraction = re.sub('^\d*\.', '', num)
    if integer == '0' or fraction == '0':
        result = integer_to_str(integer.group())
        return result

    else:
        result = integer_to_str(integer.group()) + fractional_part(fraction)
        if 'error' not in result:
            return result
        else:
            return "数字位数超过12位!"

def four_to_hanstr(num_str):
    """
    将一个4位的数字字符串转换成汉字字符串
    num_str是需要被转换的4位数字字符串
    返回4位数字字符串被转换成汉汉字字符串
    :param num_str:
    :return: 将结果返回到integer_to_str()函数
    """
    result = ""
    # 对于只输出一个0做限制
    flag = 0
    num_len = len(num_str)

    # print("传入参数:",num_str)

    for i in range(num_len):
        num = int(num_str[i])
        # 如果每4个数字一组中的最后一个数字,且其不为0
        if i != num_len - 1 and num != 0:
            result += han_list[num] + unit_list[num_len - 2 - i]
        else:
            # 如果传入的四位数,四位数字都为0则不做任何输入
            if i == num_len - 4 and int(num_str[num_len - 3])== 0 \
                    and int(num_str[num_len - 2]) == 0 \
                    and int(num_str[num_len - 1]) == 0 \
                    and num == 0:
                pass

            # 如果传入的四位数,后三位数字为0
            elif i == num_len - 3 and int(num_str[num_len - 2]) == 0 \
                    and int(num_str[num_len - 1]) == 0 \
                    and num == 0:
               break

            # 如果从左到右第2位和第3位为0只输入一个0
            elif i == num_len - 2 and int(num_str[num_len - 1]) == 0 \
                    and num == 0:
                break
            else:
                if num == 0:
                    if flag == 0:
                        result += han_list[num]
                        flag += 1
                    else:
                        pass
                else:
                    result += han_list[num]
    return result

def fractional_part(fraction_srt):
    """
    对小数部分进行处理
    :param fraction_srt:
    :return: 转化后的结果,前后加一个空格以便区分
    """
    result =""
    str_len = len(fraction_srt)
    for i in range(str_len):
        num = int(fraction_srt[i])
        result += str(han_list[num])

    return ' 点'+result

def integer_to_str(num_str):
    """
    对整数位数进行控制
    """
    str_len = len(num_str)
    if str_len > 12:
        error = "error"
        return error
    elif str_len > 8:
        # -8代表这个数字的第八位,第九位就是亿
        return four_to_hanstr(num_str[:-8]) + '亿' + \
               four_to_hanstr(num_str[-8:-4]) + '万' + \
               four_to_hanstr(num_str[-4:])

    elif str_len > 4:
        # -4代表这个数的第4位,第五位就是万
        return four_to_hanstr(num_str[:-4]) + '万' + \
               four_to_hanstr(num_str[-4:])

    else:
        return four_to_hanstr(num_str)

if __name__ == '__main__':
    num = float(input("请输入一个数:"))
    print("结果为:\n",divide(num))










============ 更改记录 ===========
2019年12月8日:发布代码
2019年12月9日0:33:完善对于整数和小数部分的处理

conpition.png (243.38 KB, 下载次数: 0)

下载附件  保存到相册

2019-12-9 00:29 上传

更改前后代码对于

更改前后代码对于

result.png (38.25 KB, 下载次数: 0)

下载附件  保存到相册

2019-12-9 00:30 上传

新的运行结果

新的运行结果

版权声明:

本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。

有关影视版权:本站只供百度云网盘资源,版权均属于影片公司所有,请在下载后24小时删除,切勿用于商业用途。本站所有资源信息均从互联网搜索而来,本站不对显示的内容承担责任,如您认为本站页面信息侵犯了您的权益,请附上版权证明邮件告知【754403226@qq.com】,在收到邮件后72小时内删除。本文链接:https://www.piaodoo.com/7794.html

搜索