2012-10-10 14 views
6

La domanda è per Python 2.6, che è ciò che abbiamo in produzione.Come formattare un numero con virgola e cifre di precisione di cui Python

ho questo requisito per la formattazione di un numero (come 1234567,0987 o 1234567,0) con virgola, e il numero specificato di cifre dopo punto decimale. Quindi, se la precisione è tre, 1234567.0987 può assomigliare a 1.234.567.099.

Ho provato ad utilizzare Locale, come suggerito da risposte a molte domande, il problema è che i risultati a due cifre dopo decimali, che non è accettabile per la mia esigenza.

Ho provato a cercare in altri posti, ma non ha trovato alcuna soluzione, e alla fine ho creato un metodo con il mio:

def format_float(value, precision = 4): 
    formatString = "%0." + str(precision) + "f"  
    str_val = formatString % value 
    first, second = str_val.split('.') 
    first = int(first) 
    group = [] 
    while True: 
     result, mod = first/1000, first % 1000 
     group.append(str(mod)) 
     if result == 0: 
      break 
     first = result 
    group.reverse() 
    return ','.join(group) + '.' + second 

ho cercato di eseguire alcuni test per testare il metodo e funziona benissimo :

# default 4 digits precision 
assert format_float(1234567890.0876543) == '1,234,567,890.0877' 
assert format_float(1.2) == '1.2000' 
assert format_float(1234) == '1,234.0000' 
assert format_float(0) == '0.0000' 

# 3 digits precision 
assert format_float(1234567890.0876543, precision=3) == '1,234,567,890.088' 
assert format_float(0, precision=3) == '0.000' 

Essendo nuovo per Python, la mia domanda è se questa sia una soluzione accettabile. Poiché questa formattazione deve essere eseguita molte volte in un ciclo continuo, apprezzerei se qualcuno potesse puntare a una soluzione migliore.

Grazie e saluti a tutti

+2

Provalo con '1000000'. –

+0

Mark, grazie. Questo è un buon bug proprio lì, ho bisogno di aggiustarlo. – cspider

+1

Non è necessario utilizzare il modulo 'locale'. Vedere la mia risposta alla domanda [_Che il modo più semplice per aggiungere le virgole per un intero in Python? _] (Http://stackoverflow.com/q/3909457/355230). – martineau

risposta

18

Io non ti credo che sembrava abbastanza in profondità nel modulo locale. locale.format() è ciò che desideri, ma assicurati di impostare prima una locale o di non raggruppare affatto.

>>> locale.setlocale(locale.LC_ALL, '') 
'en_US.UTF-8' 
>>> locale.format("%.4f", 12345.678912, grouping=True) 
'12,345.6789' 
+0

locale consapevoli FTW ... –

+1

+1 mai conosceva 'modulo locale'. –

+0

@cdhowie, grazie, questo funziona per me, anche con. Ho sorvolato l'opzione format(). – cspider

12

per Python 2.7 e 3.x si può fare qualcosa di simile:

>>> num=1234567890.0876543 
>>> "{0:,f}".format(num) 
'1,234,567,890.087654' 
>>> "{0:,.2f}".format(num) 
'1,234,567,890.08' 
>>> "{0:,f}".format(1234) 
'1,234.000000' 
+0

Ah, bastonatemi. Per inciso, questo funziona anche in 2.7.3 – kreativitea

+0

@kreativitea Appena verificato in linea lo fa. Ho provato solo su Python 2.6 dove non ha funzionato. –

+0

Grazie, tuttavia, ho modificato la mia domanda originale, questa domanda per Python 2.6. – cspider

Problemi correlati