python实现法语数字

法语数字1-1,100,000 位数, TODO递归or循环

ten_base = {20: 'vingt', 30: 'trente', 40: 'quarante', 50: 'cinquante', 60: 'soixante', 80: 'quatre-vingt'}
# 1-19
base = {1: 'un', 2: 'deux', 3: 'trois', 4: 'quatre', 5: 'cinq', 6: 'six',                     7: 'sept', 8: 'huit', 9: 'neuf', 10: 'dix',
        11: 'onze', 12: 'douze', 13: 'treize',
        14: 'quatorze', 15: 'quinze', 16: 'seize', 
        17: 'dix-sept', 18: 'dix-huit', 19: 'dix-neuf'}

20+ ~ 70+  即简单的 几十几 

def number_20_to_70(num):
    assert 20 <= num < 70
    tens_count = num // 10 * 10
    rem = num % 10
    if num % 10 == 0:
        return f'{ten_base[tens_count]}'
    else:
        if rem == 1:
            return f'{ten_base[tens_count]} et {base[rem]}'
        else:
            return f'{ten_base[tens_count]}-{base[rem]}'

法语精髓来了: 70 = 60 + 10,  80 =20*4 , 90 = 4*20 + 10

def number_70_to_99(num):
    assert 70 <= num <= 99
    header = num // 20 * 20
    rem = num % 20
    if rem == 0: #80
        return f'{ten_base[header]}s'
    else:
        return f'{ten_base[header]}-{base[rem]}'
def multi_of_ten(num):
    if num == 80:
        return ten_base[num] + 's'
    try:  # 10s
        return ten_base[num]
    except:  # 70, 90 -> 60+10, 80+10
        return ten_base[num - 10] + '-dix'


def number_over_trenty(num):
    assert 20 <= num < 100
    if num % 10 == 0:
        return multi_of_ten(num)
    try:
        tens = num // 10 * 10
        remainder = num % 10
        if remainder != 1:
            return f"{ten_base[tens]}-{base[remainder]}"
        return f"{ten_base[tens]} et {base[remainder]}"
    except:  # 70+, 90+ -> 60+10+, 80+10+
        tens = (num - 10) // 10 * 10
        remainder = num % 20
        return f"{ten_base[tens]}-{base[remainder]}"



def number(num):
    if num < 20:
        return base[num]
    elif num < 100:
        return number_over_trenty(num)
    elif 100 < num < 1000:
        if num % 100 == 0:
            if num == 100:
                return 'cent'
            return f"{base[num // 100]} cent"
        if num // 100 == 1:
            return f"cent {number(num % 100)}"
        return f"{base[num // 100]} cent {number(num % 100)}"


def ordinal_number(num):
    if num == 1:
        return {'m': 'premier', 'f': 'première'}
    else:
        root = number(num)
        if root[-1] == 'e':
            return number(num)[:-1] + 'ième'
        if root[-1] == 'q':
            return number(num) + 'uième'
        if root[-1] == 'f':
            return number(num)[:-1] + 'vième'
        else:
            return number(num) + 'ième'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值