实现自动将国际贸易单证(合同、发票)等中的金额自动转换成英文大写。
作为初学者,练练手,记录下学习过程。
简单分析:
- 单证中的英文大写必须写全额,即保留小数点两位,不进行四舍五入
- 英文大写中只能有一个AND
- 数字0-19有单独写法
- 英文数字以三位一节
代码如下
#定义基础数字
BasicNumber={0:"zero",1:"one",2:"two",3:"three",4:"four",5:"five",6:"six",7:"seven",8:"eight",9:"nine",10:"ten",11:"eleven",12:"twelfe",13:"thirteen",14:"fourteen",15:"fifteen",16:"sixteen",17:"seventeen",18:"eighteen",19:"nineteen",20:"twenty",30:"thirty",40:"forty",50:"fifty",60:"sixty",70:"seventy",80:"eighty",90:"ninety"}
#定义基本单位
BasicUnit=["","thousand","million","billion"]
def convert_double_digit(number):
#对个位及两位数的处理
if number<20 or number%10==0: #若数字小于20,或除以10余数为0(即为10的倍数时),直接从字典获取
return BasicNumber[number]
else: #反之,则获取十位对应的数字和个位对应的数字
return BasicNumber[number//10*10]+"-"+BasicNumber[number%10]
def convert_triple_digit(number):
#三位数的处理
hundred=number//100 #获取百位数字
digit=number%100 #获取十位、个位数字
if hundred !=0: #若百位数字位不等于0,则转换百位数字+后两位数字
return convert_double_digit(number//100) +" hundred " +convert_double_digit(number%100)
else: #否则,直接转换后两位数字
return convert_double_digit(number)
def convert_number(number):
#转换数字
#首先处理数字
number=int(number*100) #将数字乘以100,并获取整数部分,即截取到原数字2位小数,不进行四舍五入
number="{:.2f}".format(number/100)#将截取后的数字恢复,并格式化为2位小数
number=number.split(".") #将数字转化成格式化并用小数点分离
integer="{:,}".format(int(number[0])) #获取整数部分,指定格式字符串,以逗号分割,三位一节
decimal=int(number[1][:2])#获取小数部分,并转换为2位整数
#处理小数部分
if decimal==0:
DecimalPart="no cent"
else:
DecimalPart= convert_double_digit(decimal) +" cent"
#处理整数部分
l=integer.split(",") #按照逗号拆分字符串,获取拆分后列表
results=[] #定义转换后结果
for digit in l:
results.append(convert_triple_digit(int(digit))) #将拆分的数字转换成英文
x=len(results) # 获取转换结果的长度
IntPart="" #初始化整数部分的结果
for r in range(x):
IntPart=IntPart + results[r]+" " +BasicUnit[x-r-1]+" " #根据转换结果列表的长度获取对应的单位,并拼接到intpart
return "SAY US DOLLAR "+IntPart.upper().strip() + " AND "+DecimalPart.upper()+" ONLY"
本文介绍如何使用Python实现自动将国际贸易合同、发票中的金额转换为英文大写,详细讨论了转换规则,包括保留小数点两位、避免四舍五入、特定数字的英文表示及每三位分节的处理方式。
905

被折叠的 条评论
为什么被折叠?



