将非负整数 num 转换为其对应的英文表示

209 阅读1分钟

将非负整数 num 转换为其对应的英文表示。


'''

题目 : 将非负整数 num 转换为其对应的英文表示。
示例1:输入:num = 123
      输出:"One Hundred Twenty Three"
示例2:输入:num = 12,345
      输出:"Twelve Thousand Three Hundred Forty Five"
示例3:输入:num = 1,234,567
      输出:"One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven"
示例4:输入:num = 1,234,567,891
      输出:"One Billion Two Hundred Thirty Four Million Five Hundred Sixty Seven Thousand Eight Hundred Ninety One"
提 示:0 <= num <= 2的31次方 - 1
题目来源:CSDN每日一练
'''
'''
   说明:这个类只能将0 <= num <= 2的31次方 - 1转换为英语
'''
class num_convert_en:
#    def __init__(self):
#        self.num_input = ''
    
    num_en_list = ['Zero','One','Two','Three','Four','Five','Six','Seven',
          'Eight','Nine','Ten','Eleven','Twelve','Thirteen',
          'Fourteen','Fifteen','Sixteen','Seventeen', 'Eighteen',
          'Nineteen','Twenty','Thirty','Forty','Fifty','Sixty','Seventy',
          'Eighty','Ninety','Hundred','Thousand','Million','Billion']
    num_en_tens = ['','','Twenty','Thirty','Forty','Fifty','Sixty','Seventy',
          'Eighty','Ninety']
​
# 字符串转为数字
    def input_convert_num(self,num_input):
        try:
            num_convert =int(num_input)
            if num_convert >=0:
                return num_convert
            else:
                return num_input+'不是正整数'
        except Exception as e:
            return num_input+'不是数字'
​
    #转换0-19
    def convert_en_Nineteen(self,num_convert):
        num_en_list = ['Zero','One','Two','Three','Four','Five','Six','Seven',
          'Eight','Nine','Ten','Eleven','Twelve','Thirteen',
          'Fourteen','Fifteen','Sixteen','Seventeen', 'Eighteen',
          'Nineteen']
        num_en = num_en_list[num_convert]
        return num_en
​
    #转换0-99
    def convert_en_tens(self,num_convert):
        num_en_tens = ['','','Twenty','Thirty','Forty','Fifty','Sixty','Seventy',
          'Eighty','Ninety']
        num_en_list = ['','One','Two','Three','Four','Five','Six','Seven',
          'Eight','Nine','Ten','Eleven','Twelve','Thirteen',
          'Fourteen','Fifteen','Sixteen','Seventeen', 'Eighteen',
          'Nineteen']
        num_en = ''
        if num_convert%10 == 0:
            num_en = num_en_tens[num_convert//10%10]
        else:
            num_en = num_en_tens[num_convert//10%10]+num_en_list[num_convert%10]
        return num_en
​
    #转换100-999
    def convert_en_hundred(self,num_convert):
        num_index = num_convert//100
        num_hundred =self.convert_en_tens(num_index)
        num_index_tens = num_convert%100
        num_tens = ''
        if num_index_tens > 19:
            num_tens = self.convert_en_tens(num_index_tens)
        else:
            num_tens = self.convert_en_Nineteen(num_index_tens)
        if num_tens == 'Zero':
            return num_hundred+' '+'Hundred'
        else:
            return num_hundred+' '+'Hundred '+num_tens
​
    #将数字转换为序列,一个元素转三位
    def num_sep(self,num_input):
        num_sep_str = []
        num_sep_str_int = []
        if isinstance(self.input_convert_num(num_input),int) :
            index = len(num_input)%3
            num_sep_str.append(num_input[0:index])
            num_sub = num_input[index:]
            num_sub_list = []
            for i in range(len(num_sub)):
                if i%3 == 0:
                    num_sub_list.append(i)
            for i in num_sub_list:
                num_sep_str.append(num_sub[i:i+3])
            for i in num_sep_str:
                num_sep_str_int.append(int(i))
        return num_sep_str_int
        
    #为数字序列加上单位
    def num_convert(self,num):
        num_list = self.num_sep(num)
        num_list_en =[]
        for num in num_list:
            if 0 <= num <20:
                num_en = self.convert_en_Nineteen(num)
                num_list_en.append(num_en)
            elif 20 <= num <99:
                num_en =self.convert_en_tens(num)
                num_list_en.append(num_en)
            else:
                num_en =self.convert_en_hundred(num)
                num_list_en.append(num_en)
        num_list_units =['Thousand','Million','Billion']
        num = len(num_list_en)
        if num == 1:
            return num_list_en
        elif num ==2:
            num_list_en[-2] = num_list_en[-2]+' Thousand'
            return num_list_en
        elif num ==3:
            num_list_units =[' Thousand',' Million']
            for num in range(0,len(num_list_units)):
                num_rev = int('-'+str(num+2))
                num_list_en[num_rev] = num_list_en[num_rev]+num_list_units[num]
            return num_list_en
        else :
            num_list_units =[' Thousand',' Million',' Billion']
            for num in range(0,len(num_list_units)):
                num_rev = int('-'+str(num+2))
                num_list_en[num_rev] = num_list_en[num_rev]+num_list_units[num]
            return num_list_en
​
if __name__ == '__main__':
    num_input = input("请输入非负整数:")
    num_en = num_convert_en()
    num_list = num_en.num_sep(num_input)
#    print(num_list)
    num_list_en = num_en.num_convert(num_input)
    print(" ".join(num_list_en))
    
​
​

\