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