miracle2016 发表于 2022-7-6 11:56

小写金额转大写金额

本帖最后由 miracle2016 于 2022-7-6 11:59 编辑

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)
                length = length - extra
                start, end = extra, 4 + extra
            else:
                start, end = 0, 4
            while length:
                self.pre.append(self.num_integer)
                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 == '000':
            return dictionary] + level2

      # Normal
      res, p = '', length
      for i in range(0, length):
            # deal with prefix is '0'
            if (res == '' or res == dictionary]) and num == '0':
                # only one '0'
                if flag:
                  res += dictionary]
                  flag = False
                p -= 1
                continue
            # deal with '1001'
            if i + 1 < length and num == '0' and num == '0':
                p -= 1
                continue
            # deal with '1010' '1110'
            if i == length - 1 and num == '0':
                continue
            res += dictionary]
            if p > 1 and num != '0':
                res += level2
            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
            else:
                self.integer_chn += level1
            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]
            if (i + 1) <= 2:
                self.float_chn += level3

    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'^[-+]?+\.?+$')

    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("你输入的不是数字,请重新输入")


alinwei 发表于 2022-7-6 12:13

搜狗输入法下,输入字母V,然后直接输入数字就可以转换成大写金额了。

miracle2016 发表于 2022-7-6 12:15

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

{:1_893:}嗯,这个是我自己做的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)),"")&"元","")&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)),"")&"元","")&SUBSTITUTE(SUBSTITUTE(TEXT(RIGHT(RMB(A1,2),2),"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

wycdd 发表于 2022-7-6 12:12
能简单点吗?

您可以提个建议,我也觉得好复杂。但是我想不到怎么简单了

甜萝 发表于 2022-7-6 12:21

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

也对 一般来说 实际上不会用这么大的数字转 不过开头这种写法 有点熟悉{:301_978:}

wycdd 发表于 2022-7-6 12:50

miracle2016 发表于 2022-7-6 12:14
您可以提个建议,我也觉得好复杂。但是我想不到怎么简单了

暂时也没想到啥好的建议:lol

我心飞翔1995 发表于 2022-7-6 13:16

万亿以上的读法解析其实都差不多,可以缩减为一个,然后就是针对中间连续0的处理,和末尾纯0的处理
页: [1] 2 3 4
查看完整版本: 小写金额转大写金额