Robitex's Blog

Ideas in the web

Numeri in lettere con Python

Scarica l’articolo nel formato PDF per la stampa

Sommario

L’articolo presenta il codice nel linguaggio Python per convertire un numero in parole nel comune formato ‘finanziario’.

Il codice

Avevamo già risolto questo problema prima con Java e poi con Lua. Lua è un linguaggio di scripting assai simile a Python e non è stato difficile convertire il listato. Ho dapprima effettuato su una copia del listato in Lua, una serie di sostituzioni: then con :, function con def per esempio. Come secondo passo ho poi sistemato con precisione l’identazione del codice poiché in Python è il mezzo per individuare i blocchi di istruzioni.

Terminate queste due operazioni, mi sono ritrovato con un codice Python quasi del tutto completo. Mancava trovare il sostituto per alcune funzioni di libreria Lua, risolte con lo slicing e con alcune funzioni di base matematiche. Infine ho migliorato la funzione di wrapper della funzione ricorsiva in una versione più completa e razionale rispetto all’originale Lua. Ecco il risultato:

#!/usr/bin/python

# script di traduzione di numeri in lettere
# nella lingua italiana
# traduce un numero in lettere

# funzione ricorsiva
def NumberToTextInteger(n):
    if n == 0: 
        return ""
        
    elif n <= 19:
        return ("uno", "due", "tre", "quattro", "cinque", 
                "sei", "sette", "otto", "nove", "dieci", 
                "undici", "dodici", "tredici", 
                "quattordici", "quindici", "sedici", 
                "diciassette", "diciotto", "diciannove")[n-1]
                
    elif n <= 99:
        decine = ("venti", "trenta", "quaranta",
                  "cinquanta", "sessanta", 
                  "settanta", "ottanta", "novanta")
        letter = decine[int(n/10)-2]
        t = n%10
        if t == 1 or t == 8:
            letter = letter[:-1]
        return letter + NumberToTextInteger(n%10)
        
    elif n <= 199:
        return "cento" + NumberToTextInteger(n%100)
        
    elif n <= 999:
        m = n%100
        m = int(m/10)
        letter = "cent"
        if m != 8:
            letter = letter + "o"
        return NumberToTextInteger( int(n/100)) + \
               letter + \
               NumberToTextInteger(n%100)
        
    elif n<= 1999 :
        return "mille" + NumberToTextInteger(n%1000)
    
    elif n<= 999999:
        return NumberToTextInteger(int(n/1000)) + \
               "mila" + \
               NumberToTextInteger(n%1000)
        
    elif n <= 1999999:
        return "unmilione" + NumberToTextInteger(n%1000000)
        
    elif n <= 999999999:
        return NumberToTextInteger(int(n/1000000))+ \
               "milioni" + \
               NumberToTextInteger(n%1000000)
    elif n <= 1999999999:
        return "unmiliardo" + NumberToTextInteger(n%1000000000)
        
    else:
        return NumberToTextInteger(int(n/1000000000)) + \
               "miliardi" + \
               NumberToTextInteger(n%1000000000)

# funzione wrapper
def NumberToText(x, pos=2):
   """ Ritorna un numero tradotto in lettere
       secondo un formato 'finanziario'
   """
   sign = ""
   if x<0:
      sign = "meno"
      x = abs(x)
   x = round(x, pos)
   n = int(x)
   frmt = "{0:0."+"{0:d}".format(pos)+"f}"
   spic = frmt.format(x-n)[2:]
   if n == 0:
      num = "zero"
   else:
      num = NumberToTextInteger(n)
   return sign+num+"/"+spic

# prelevo il valore numerico
value = input("Valore: ")

print("il numero {0} in lettere =".format(value))
print("{0}".format(NumberToText(value)))

Test (note tecniche)

Per testare il codice occorre aver installato un interprete Python. Avviate una finestra di console e scrivete il nome che avete dato al file contenente il codice (confrontate l’immagine sottostante presa da un sistema Ubuntu 10.04).

Esecuzione del programma nel terminale di Linux Ubuntu

Esecuzione del programma nel terminale di Linux Ubuntu

Auguri

Un Augurio di Buon Natale e per uno splendido nuovo anno 2012!

Lascia un Commento

Fill in your details below or click an icon to log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Log Out / Modifica )

Foto Twitter

You are commenting using your Twitter account. Log Out / Modifica )

Foto di Facebook

You are commenting using your Facebook account. Log Out / Modifica )

Connecting to %s

Follow

Get every new post delivered to your Inbox.