2012-11-22 8 views
18

Un rapido gioco da ragazzi:Format Python troncato galleggiante come int nella stringa

some_float = 1234.5678 
print '%02d' % some_float # 1234 

some_float = 1234.5678 
print '{WHAT?}'.format(some_float) # I want 1234 here too 

Nota: {:.0f} non è un'opzione, perché arrotonda (restituisce 1235 in questo esempio).

format(..., int(some_float)) è esattamente ciò che sto cercando di evitare, per favore non suggerirlo.

+2

@MartijnPieters Forse perché arrotonda piuttosto che tronca? '' {: .0f} ". Format (1234.5678)' è '" 1235 "', non '" 1234 "'. – Blckknght

+1

Cosa succede se la conversione del float in 'int()' o il troncamento sono le uniche opzioni? Il passo successivo è creare una sottoclasse 'float()' per personalizzare l'hook '.__ format __()'. –

+0

Si noti che in questo frammento: ''% 02d'% some_float' sta avvenendo una conversione implicita a' int', non è possibile evitare una sorta di conversione per la stampa nel formato desiderato –

risposta

11

E 'possibile estendere il linguaggio di formattazione stringa standard estendendo la classe string.Formatter:

class MyFormatter(Formatter): 
    def format_field(self, value, format_spec): 
     if format_spec == 't': # Truncate and render as int 
      return str(int(value)) 
     return super(MyFormatter, self).format_field(value, format_spec) 

MyFormatter().format("{0} {1:t}", "Hello", 4.567) # returns "Hello 4" 
12

Questo funziona:

from math import trunc 
some_float = 1234.5678 

print '{:d}'.format(trunc(some_float)) 
=> 1234 

O semplicemente fare questo, del resto:

print trunc(some_float) 
=> 1234 

Penso che sia una risposta accettabile, evita la conversione in int. Si noti che in questo frammento: '%02d' % some_float sta accadendo una conversione implicita a int, non è possibile evitare una sorta di conversione per la stampa nel formato desiderato.

-9

questo funzionerà anche:

some_float = 1234.5678 
f = lambda x: str(x)[:str(x).find('.')] 
print '{}'.format(f(some_float)) 
=> 1234 

Dopo aver fatto una% timeit testare sembra che la funzione trunc dalla libreria matematica è più veloce, quindi è preferibile math.trunc se è necessario formattare molti numeri in questo modo.

+4

Ugh .. questa è una tecnica davvero pessima – Vlad