Robitex's Blog
Ideas in the web
Numeri in lettere con Python
Pubblicato da su 24/12/2011
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).
Auguri
Un Augurio di Buon Natale e per uno splendido nuovo anno 2012!

Recent comments