法语数字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'