吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2892|回复: 18
收起左侧

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

[复制链接]
Rui. 发表于 2019-12-8 16:34
本帖最后由 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:完善对于整数和小数部分的处理

更改前后代码对于

更改前后代码对于

新的运行结果

新的运行结果

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| Rui. 发表于 2019-12-8 21:01
冥月影 发表于 2019-12-8 18:23
请问一下大佬,Python容易上手吗,有点java基础。

哥们,纠正一下,我不是大佬,我只是想分享一下,我也是学python没多久,
你学了Java来学python上手应该回简单,我是学了C然后学的python,毕竟你有一门语言的语法的基础学其他的语言会容易一点;加油,只要付出时间和努力,都可以的!
rosesword 发表于 2019-12-8 19:03
冥月影 发表于 2019-12-8 18:23
请问一下大佬,Python容易上手吗,有点java基础。

容不容易不好说。看跟什么比。
但根据我目前的文献查阅来看,Python目前以及未来,会是主流的编程语言。
如果要学,还是推荐学Python
diyikuai 发表于 2019-12-8 16:54
 楼主| Rui. 发表于 2019-12-8 16:57
diyikuai 发表于 2019-12-8 16:54
支持了  入坑了易语言,不想换了

我的易语言不怎么了解,似乎我知道易语言都是因为”游戏外G“
dhz0105 发表于 2019-12-8 17:47
有问题,51亿万零是什么鬼?
dhz0105 发表于 2019-12-8 17:48
diyikuai 发表于 2019-12-8 16:54
支持了  入坑了易语言,不想换了

有学习易语言的时间精力,不如专心研究下C语言!
heavyd 发表于 2019-12-8 17:54
我想学Python,0中之0 开始
shaunkelly 发表于 2019-12-8 18:02
本帖最后由 shaunkelly 于 2019-12-8 18:08 编辑

我试运行一下看看

20191208180822.png

还有一点不完美哦,超过12位不计算,但是后面还有一个点零???是什么情况的?
hf2008paopao 发表于 2019-12-8 18:03
书的链接分享一个
社区主任 发表于 2019-12-8 18:15
为程序员点赞
冥月影 发表于 2019-12-8 18:23
请问一下大佬,Python容易上手吗,有点java基础。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 20:34

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表