吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3831|回复: 30
收起左侧

[Python 转载] 小写金额转大写金额

[复制链接]
miracle2016 发表于 2022-7-6 11:56
本帖最后由 miracle2016 于 2022-7-6 11:59 编辑

[Asm] 纯文本查看 复制代码
import re

dictionary = {'0': '零', '1': '壹', '2': '贰', '3': '叁', '4': '肆', '5': '伍', '6': '陆', '7': '柒', '8': '捌', '9': '玖'}
level1 = {1: '圆', 2: '万', 3: '亿', 4: '兆'}
level2 = {2: '拾', 3: '佰', 4: '仟'}
level3 = {1: '角', 2: '分'}


class DecimalToChn:
    def __init__(self, que_decimal):
        self.que_decimal = str(que_decimal)
        self.num_float = None
        self.num_integer = None
        self.pre = []
        self.integer_chn = []
        self.float_chn = []

    def query(self):
        '''
        验证数字,整数大于16位数,小数多余小数点后面2位数的全部弄成0
        :return:
        '''

        if "." not in self.que_decimal:
            self.que_decimal = self.que_decimal + "." + "0"

        if len(self.que_decimal.split('.')) <= 16 and len(self.que_decimal.split('.')) <= 2:
            return self.que_decimal
        else:
            return 0

    def split_num(self):
        """
        将进来的数字拆成整数部分跟小数部分
        :return:
        """
        number = self.query()
        self.num_integer, self.num_float = number.split('.')

    def process_integer(self):
        """
        处理整数部分
        :return:
        """
        length = len(self.num_integer)

        # 整数部分小于千位的
        if length <= 4:
            self.pre.append(self.num_integer)
            # print("整数部分小于4位的:",self.pre)
        else:
            # 整数部分大于千位的
            extra = length % 4
            if extra != 0:
                self.pre.append(self.num_integer[0: extra])
                length = length - extra
                start, end = extra, 4 + extra
            else:
                start, end = 0, 4
            while length:
                self.pre.append(self.num_integer[start: end])
                start += 4
                end += 4
                length -= 4
        # print("整数部分大于4位的:", self.pre)

    def per_conver(self, num):
        length = len(num)
        flag = True

        # Special
        # deal with '0000'
        if num == '0000':
            return ''
        # deal with '1000'
        if num[1:] == '000':
            return dictionary[num[0]] + level2[4]

        # Normal
        res, p = '', length
        for i in range(0, length):
            # deal with prefix is '0'
            if (res == '' or res == dictionary[num[i]]) and num[i] == '0':
                # only one '0'
                if flag:
                    res += dictionary[num[i]]
                    flag = False
                p -= 1
                continue
            # deal with '1001'
            if i + 1 < length and num[i + 1] == '0' and num[i] == '0':
                p -= 1
                continue
            # deal with '1010' '1110'
            if i == length - 1 and num[i] == '0':
                continue
            res += dictionary[num[i]]
            if p > 1 and num[i] != '0':
                res += level2[p]
            p -= 1
        return res

    def convert_integer(self):
        self.split_num()
        self.process_integer()
        # print(self.pre)
        p = len(self.pre)
        for i in self.pre:
            per_res = self.per_conver(i)
            self.integer_chn += per_res
            if p > 0 and per_res != '':
                self.integer_chn += level1[p]
            else:
                self.integer_chn += level1[1]
            p -= 1

    def convert_float(self):
        # print(self.num_float)
        if self.num_float == "00":
            self.num_float = ""
        for i in range(0, len(self.num_float)):
            self.float_chn += dictionary[self.num_float[i]]
            if (i + 1) <= 2:
                self.float_chn += level3[i + 1]

    def convert(self):
        self.convert_integer()
        self.convert_float()
        # print(self.float_chn)
        if self.float_chn:
            return ''.join(self.integer_chn + self.float_chn)+"整"
        return ''.join(self.integer_chn) +"整"


def re_num(float_number):
    value = re.compile(r'^[-+]?[0-9]+\.?[0-9]+$')

    result = value.match(float_number)

    return result


if __name__ == '__main__':
    while True:
        num = input("请输入您想要转的金额:")
        result = re_num(num)
        if result:
            print(DecimalToChn(num).convert())
            continue
        print("你输入的不是数字,请重新输入")


免费评分

参与人数 2吾爱币 +6 热心值 +1 收起 理由
RainH + 1 谢谢@Thanks!
苏紫方璇 + 5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

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

alinwei 发表于 2022-7-6 12:13
搜狗输入法下,输入字母V,然后直接输入数字就可以转换成大写金额了。

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
kaola0517 + 1 + 1 学到了
罩到胸前必有沟 + 1 + 1 学习了

查看全部评分

 楼主| miracle2016 发表于 2022-7-6 12:15
alinwei 发表于 2022-7-6 12:13
搜狗输入法下,输入字母V,然后直接输入数字就可以转换成大写金额了。

嗯,这个是我自己做的djangao合同管理系统里面的一个小脚本,拿出来共享一下
kvttt_2021 发表于 2024-1-15 17:38
lilukang12345 发表于 2022-7-6 17:42
=IF(ROUND(A1,2)=0,"",IF(A1=1,TEXT(INT(ROUND(ABS(A1),2)),"[dbnum2]")&"元","")&SUBSTITUTE(SUBSTITUTE(T ...

经验证:正确
lilukang12345 发表于 2022-7-6 17:42
=IF(ROUND(A1,2)=0,"",IF(A1<0,"负","")&IF(ABS(A1)>=1,TEXT(INT(ROUND(ABS(A1),2)),"[dbnum2]")&"元","")&SUBSTITUTE(SUBSTITUTE(TEXT(RIGHT(RMB(A1,2),2),"[dbnum2]0角0分;;整"),"零角",IF(A1^2<1,,"零")),"零分","整"))
甜萝 发表于 2022-7-6 12:02
本帖最后由 paypojie 于 2022-7-6 12:11 编辑

粗略的看了一下 感觉写的还行 1000000000000000 转的了 10000000000000000 就转不了
wycdd 发表于 2022-7-6 12:12
能简单点吗?
 楼主| miracle2016 发表于 2022-7-6 12:14
paypojie 发表于 2022-7-6 12:02
粗略的看了一下 感觉写的还行 1000000000000000 转的了 10000000000000000 就转不了

整数大于16位不转,太麻烦了一般也用不上
 楼主| miracle2016 发表于 2022-7-6 12:14

您可以提个建议,我也觉得好复杂。但是我想不到怎么简单了
甜萝 发表于 2022-7-6 12:21
miracle2016 发表于 2022-7-6 12:14
整数大于16位不转,太麻烦了一般也用不上

也对 一般来说 实际上不会用这么大的数字转 不过开头这种写法 有点熟悉
wycdd 发表于 2022-7-6 12:50
miracle2016 发表于 2022-7-6 12:14
您可以提个建议,我也觉得好复杂。但是我想不到怎么简单了

暂时也没想到啥好的建议
我心飞翔1995 发表于 2022-7-6 13:16
万亿以上的读法解析其实都差不多,可以缩减为一个,然后就是针对中间连续0的处理,和末尾纯0的处理
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-24 18:29

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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