2012-11-22 10 views
18

Ein schnellen no-brainer:Format abgeschnitten Python float als int in String

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

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

Hinweis: {:.0f} ist keine Option, weil es rundet (gibt 1235 in diesem Beispiel).

format(..., int(some_float)) ist genau das, was ich versuche zu vermeiden, bitte nicht vorschlagen, dass.

+2

@MartijnPieters Vielleicht, weil es Runden statt Verkürzungen? '{: .0f}". Format (1234.5678) 'is' "1235" ', nicht' "1234" '. – Blckknght

+1

Was ist, wenn die Konvertierung von float in 'int()' oder das Abschneiden des Floats die einzigen Optionen sind? Der nächste Schritt besteht darin, eine benutzerdefinierte Unterklasse 'float()' zu erstellen, um den '.__ format __()' Hook anzupassen. –

+0

Beachten Sie, dass in diesem Snippet: ''% 02d'% some_float 'eine implizite Konvertierung in' int' stattfindet, können Sie eine Konvertierung für das Drucken im gewünschten Format nicht vermeiden –

Antwort

11

Es ist möglich, die Standard-String-Formatierungssprache zu erweitern, indem die Klasse erweitert 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

Dies funktioniert:

from math import trunc 
some_float = 1234.5678 

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

Oder dies nur tun, was das betrifft:

print trunc(some_float) 
=> 1234 

Ich denke, es ist eine akzeptable Antwort, es vermeidet die Umstellung auf int. Beachten Sie, dass in diesem Code-Schnipsel: '%02d' % some_float eine implizite Konvertierung in int stattfindet, können Sie eine Konvertierung für das Drucken im gewünschten Format nicht vermeiden.

-9

Dies wird auch funktionieren:

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

Nach einem% tut timeit testen Sie es wie die trunc Funktion sieht von Math-Bibliothek ist schneller, so math.trunc wäre bevorzugt, wenn Sie viele Zahlen auf diese Weise formatieren müssen.

+4

Ugh .. das ist wirklich eine schlechte Technik – Vlad