Quand je l'ai googlé, il n'y avait pas beaucoup d'échantillons et c'était juste vieux (version Python2), donc je l'ai fait. (Corrigé car c'était un bug)
python
import re
tt_ksuji = str.maketrans('1 2 3 4 5 6 7 8 90 Ichi 2', '1234567890123')
re_suji = re.compile(r'[10 millions de milliards de milliards\d]+')
re_kunit = re.compile(r'[Cent mille]|\d+')
re_manshin = re.compile(r'[100 milliards de milliards]|[^100 milliards de milliards]+')
TRANSUNIT = {'Dix': 10,
'Ramasser': 10,
'cent': 100,
'mille': 1000}
TRANSMANS = {'Dix mille': 10000,
'Milliard': 100000000,
'Mille milliards': 1000000000000}
def kansuji2arabic(kstring: str, sep=False):
"""Convertir des nombres chinois en nombres arabes"""
def _transvalue(sj: str, re_obj=re_kunit, transdic=TRANSUNIT):
unit = 1
result = 0
for piece in reversed(re_obj.findall(sj)):
if piece in transdic:
if unit > 1:
result += unit
unit = transdic[piece]
else:
val = int(piece) if piece.isdecimal() else _transvalue(piece)
result += val * unit
unit = 1
if unit > 1:
result += unit
return result
transuji = kstring.translate(tt_ksuji)
for suji in sorted(set(re_suji.findall(transuji)), key=lambda s: len(s),
reverse=True):
if not suji.isdecimal():
arabic = _transvalue(suji, re_manshin, TRANSMANS)
arabic = '{:,}'.format(arabic) if sep else str(arabic)
transuji = transuji.replace(suji, arabic)
elif sep and len(suji) > 3:
transuji = transuji.replace(suji, '{:,}'.format(int(suji)))
return transuji
En fait, tout nombre chinois ou arabe est désormais normalisé en un nombre arabe demi-largeur.
kansuji2arabic('Montant du budget de l'exercice 2007 135 millions, 164 yens', True)
'Budget 2015 montant 1,035,001,164 yens'
Recommended Posts