[Python] Operazioni con i numeri

Manlio Perillo manlio_perillo a libero.it
Mar 7 Ott 2008 19:06:03 CEST


Daniele Varrazzo ha scritto:
> On Tue, 7 Oct 2008 12:09:55 -0400, "Antonio Cangiano" <acangiano a gmail.com>
> wrote:
>> On Tue, Oct 7, 2008 at 11:58 AM, Daniele Varrazzo <piro a develer.com>
> wrote:
>>> No, non lo è. Io di solito aggiro la cosa con:
>>>
>>> In [1]: s = "20,90"
>>>
>>> In [2]: print float(s.replace(",", "."))
>>> 20.9
>> Occhio che gli ammerregani usano la virgola per separare gruppi di cifre:
>>
>>>>> s = "10,239.59"
>>>>> print float(s.replace(",","."))
>> Traceback (most recent call last):
>>   File "<stdin>", line 1, in <module>
>> ValueError: invalid literal for float(): 10.239.59
> 
> Ipotizzo che l'OP usi un computer italiano (con sopra installato windows) e
> debba parsare numeri emessi da un programma su tale piattaforma. Ipotizzo
> anche che non ci sia un separatore decimale, che in Italia è il punto,
> perché anche in questo caso ("12.345,67") la mia ricetta fallirebbe.
> 
> Ovviamente è banale risolvere il problema:
> 
>     In [3]: s = "12.345,67"
> 
>     In [4]: print float(s.replace(".","").replace(",", "."))
>     12345.67
> 

Meglio ancora se i separatori sono configurabili.
Ad esempio usando, come default, i valori previsti per il dato locale.

Usando Babel (http://babel.edgewall.org/):

     locale = Locale.parse(locale)
     try:
         return float(string.replace(get_group_symbol(locale), '')
                            .replace(get_decimal_symbol(locale), '.'))
     except ValueError:
          raise NumberFormatError(
              '%r is not a valid decimal number' % string)

(da http://babel.edgewall.org/browser/trunk/babel/numbers.py)


> ma è scontato (e ora lo splicito anche) che funziona solo se si sa quale
> formato si sta convertendo, non se lo si applica a una stringa dalla
> formattazione sconosciuta.
> 


Manlio Perillo


Maggiori informazioni sulla lista Python