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!

2 risposte a “Numeri in lettere con Python

  1. Pingback:Numeri in lettere in Go « Robitex's Blog

  2. Pingback:Numeri in lettere in Falcon « Ok, panico

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: