int2txt_fi.py

chiman 24.01.05 17:42

Kokonaisluvut tekstiksi (esim. 213 -> kaksisataakolmetoista)

 Tekstiversio  Arvo: 2 (2 ääntä)  Äänestä: +  -
# -*- coding: latin1 -*-
#
# Converts integers to Finnish text
# Author: Chiman 1/2005

groups = [['yksi',     ''],
          ['tuhat',    'tuhatta'],
          ['miljoona', 'miljoonaa'],
          ['miljardi', 'miljardia']]

ones = { 0: '',          1: 'yksi',      2: 'kaksi',   3: 'kolme',
         4: 'neljä',     5: 'viisi',     6: 'kuusi',   7: 'seitsemän',
         8: 'kahdeksan', 9: 'yhdeksän', 10: 'kymmenen' }

def _tens_to_txt(a):
    if a < 11:
        return ones[a]
    if a < 20:
        return ones[a % 10] + 'toista'
    return ones[a / 10] + 'kymmentä' + ones[a % 10]

def _hundreds_to_txt(a):
    if 99 < a < 200:
        return 'sata'
    if a > 199:
        return ones[a / 100] + 'sataa'
    return ''

def _group_to_txt(a, i):
    if a < 1 or a > 999:
        return ''
    if a == 1:
        return groups[i][0]
    return _hundreds_to_txt(a) + _tens_to_txt(a % 100) + groups[i][1]

def int2txt_fi(a):
    """Return integer as Finnish text"""
   
    # Handle negative numbers
    a, sign = [(a, ''), (-a, 'miinus ')][a < 0]

    # Return an empty string if the number is too big for us
    if a > 1000 ** len(groups) - 1:
        return ''

    # Convert each three-number group to text separately
    g = [_group_to_txt(a / (1000**i) % 1000, i) for i in range(len(groups))]
    g.reverse()
    return sign + ' '.join([w for w in g if w]) or 'nolla'

if __name__ == '__main__':
    samples = [0, 25, 100, 1043, -108642, 1402000138]
    lgth = max([len(str(a)) for a in samples])
    for s in samples:
        print '%*d - %s' % (lgth, s, int2txt_fi(s))

# Sample output:
#          0 - nolla
#         25 - kaksikymmentäviisi
#        100 - sata
#       1043 - tuhat neljäkymmentäkolme
#    -108642 - miinus satakahdeksantuhatta kuusisataaneljäkymmentäkaksi
# 1402000138 - miljardi neljäsataakaksimiljoonaa satakolmekymmentäkahdeksan
 

chiman 17:49 24.1.05 
Värikoodattu versio on nähtävissä täällä. Toivottavasti Kuhaan tulee jossain vaiheessa värikoodaus Python-pätkillekin.
editoitu: 19:58 24.1.05
pllk 19:52 24.1.05 
Tässä tulee vastaava temppu toiseen suuntaan. Luvun muodon tarkistus tosin puuttuu.
def suomestaluvuksi(teksti):
    numerot = ['', 'yksi', 'kaks', 'kolm', 'nelj', 'viis', 'kuus', 'seit', 'kahd', 'yhde']
    kertoimet = ['', 'tuhat', 'miljo', 'milja', 'biljo', 'bilja']
    luku = ryhma = numero = 0
   
    for i in range(0, len(teksti)):
        lyhyt, pitka = teksti[i:i+4], teksti[i:i+5]
        if lyhyt in numerot:
            numero = numerot.index(lyhyt)
        if lyhyt == 'tois':
            ryhma += numero + 10
            numero = 0
        if lyhyt == 'kymm':
            ryhma += numero * 10 + (numero == 0) * 10
            numero = 0
        if lyhyt == 'sata':
            ryhma += numero * 100 + (numero == 0) * 100
            numero = 0           
        if pitka in kertoimet:
            luku += (ryhma + numero) * 1000 ** kertoimet.index(pitka)
            ryhma = numero = 0
           
    return luku + ryhma + numero

print suomestaluvuksi('sataviisitoista')
Ztane 12:57 28.1.05 
mikä ihme biljardi?