Numeri troppo grandi o troppo piccoli – 2

sl100

Continuo (e concludo) su come tratto numeri troppo grandi o troppo piccoli, proseguendo da qui e con un chiarimento (solo per me) raccontato qui.

Il post precedente si concludeva con l’osservazione che a volte è meglio Excel (o equivalenti open source). E poi un conto è la programmazione ma alla fine nella relazione i numeri devo scriverli in italiano.

Conviene usare Python (o, in alternativa Node), qualcosa come questo:

$ python3 -q
>>> N = 123456789
>>> t = '{:,}'.format(N)
>>> t
'123,456,789'
>>> t = t.replace(',', '.')
>>> t
'123.456.789'

OK, facilmente leggibile; volendo si potrebbe anche rendere come piace a qualcuno, i mate per esempio, usando uno spazio al posto del punto, così:

>>> t.replace('.', ' ')
'123 456 789'

Questo va bene per gli interi ma deve funzionare anche per i numeri reali, quelli con la virgola (cioè  il punto  no la virgola).

>>> N = 123456789.369
>>> t = '{:,}'.format(N)
>>> t
'123,456,789.369'
>>> t = t.replace('.', '_')
>>> t
'123,456,789_369'
>>> t = t.replace(',', '.')
>>> t
'123.456.789_369'
>>> t = t.replace('_', ',')
>>> t
'123.456.789,369'

OK, un ultimo passo: la precisione cioè il numero di cifre dopo la virgola:

>>> round(N, 2)
123456789.37

OK, notare che round() funziona con i numeri; si può usare anche con le stringhe ma queste devono essere  ‘mericane  da programmatori:

>>> N = '123456789.125'
>>> round(float(N), 2)
123456789.12

altrimenti ottengo un errore

>>> N = '123456789,125'
>>> round(float(N), 2)
Traceback (most recent call last):
  File "", line 1, in 
ValueError: could not convert string to float: '123456789,125'

OK, l’arrotondamento va fatto prima dell’italianizzazione del numero. Raccogliere tutto quanto in unn script è immediato (fnum.py):

from sys import argv
if len(argv) == 1:
    prec = 2
else:
    prec = int(argv[1])

st = input('')
# '{:,}'.format()
st = st.replace(',', '.')
isfloat = '.' in st
try:
    if isfloat:
        n = round(float(st), prec)
        if n == int(n):
            n = int(n)
    else:
        n = int(st)

except:
    print('errore!')
    exit()

#italianizzo
t = '{:,}'.format(n)
t = t.replace('.', '_')
t = t.replace(',', '.')
t = t.replace('_', ',')

print(t)
$ echo 123456789.369 | py3 fnum.py 2
123.456.789,37
$ echo 123456789 | py3 fnum.py 2
123.456.789
$ echo 123456789.0002 | py3 fnum.py 2
123.456.789

OK, proprio come Excel (o meglio equivalenti open). E possiamo anche inserirlo automaticamente nella clipboard, come raccontato nel secondo dei post citati:

$ echo 123456789.0002 | py3 fnum.py 2 | _k
123.456.789
$ echo `_p`
123.456.789

Ovviamente potevo scrivere (meglio) anche:

$ echo $(_p)
123.456.789

Ma in fondo posso inglobare nello script anche _k, troppo semplice , lasciato come esercizio. Inoltre in quest’ultimo caso lo script fnum.py non risulta più Windows compatibile (dovesse servire).

Altro esercizio, allenarsi su quanto suggerito da Katie, qui.

Posta un commento o usa questo indirizzo per il trackback.

Rispondi

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

Logo di WordPress.com

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

Google photo

Stai commentando usando il tuo account Google. 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 )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: