2012-11-13 6 views
7

Come posso dire esplicitamente a python di leggere un numero decimale usando il punto o la virgola come separatore decimale? Non so le impostazioni di localizzazione del PC che verrà eseguito il mio script, e questo non dovrebbe influenzare la mia domanda, voglio solo dire:Converte le stringhe Python in float esplicitamente usando la virgola o il punto come separatori

f = read_float_with_point("3.14") 

o

f = read_float_with_comma("3,14") 

penso che la scrittura

def read_float_with_comma(num): 
    return float(num.replace(",", ".") 

non è sicuro, perché non conosco le impostazioni locali!

+0

Che cosa significa "1.000": uno o mille? – katrielalex

+1

@katrielalex: esattamente, ciò dipende dalla locale. –

risposta

9

perché io non conosco le impostazioni locali

si poteva guardare che utilizzando il locale module:

>>> locale.nl_langinfo(locale.RADIXCHAR) 
'.' 

o

>>> locale.localeconv()['decimal_point'] 
'.' 

Usando questo, il codice potrebbe diventare:

import locale 
_locale_radix = locale.localeconv()['decimal_point'] 

def read_float_with_comma(num): 
    if _locale_radix != '.': 
     num = num.replace(_locale_radix, ".") 
    return float(num) 

Meglio ancora, lo stesso modulo ha una funzione di conversione per voi, chiamato atof():

import locale 

def read_float_with_comma(num): 
    return locale.atof(num) 
+0

Questo userà le impostazioni locali, che forse non è ciò che vuole diegogb. Cosa fare se è necessario eseguire l'output/analizzare i dati in una diversa localizzazione come corrente? Il modulo locale scoraggia in modo esplicito la modifica delle impostazioni locali in una libreria, quindi questo metodo è valido solo per gli script semplici. – dangonfast

+0

@ jeckyll2hide: per semplici script o programmi GUI desktop o qualsiasi altra cosa che non ha bisogno di servire più client (in rete). –

+0

@ jeckyll2hide: ma l'OP desiderava in particolare sapere che cosa avrebbe usato il PC su cui avrebbe eseguito il suo script, quindi questo è esattamente ciò che si voleva. Ecco perché il PO ha contrassegnato questa risposta come accettata; il loro problema è stato risolto. –

1

È possibile utilizzare babel per analizzare decimali nei formati locali:

>>> parse_decimal('1,099.98', locale='en_US') 
Decimal('1099.98') 
>>> parse_decimal('1.099,98', locale='de') 
Decimal('1099.98')