41

簡単な簡単な説明:

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

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

注:{:.0f}丸められるため、オプションではありません(1235この例では戻ります)。

format(..., int(some_float))まさに私が避けようとしていることです、それを示唆しないでください。

4

4 に答える 4

24

生のフォーマット文字列を使用してfloatをレンダリングする方法の組み込み動作について言及する価値があります。0.5に関して小数部分がどこにあるかを事前に知っている場合は、最初に試みたフォーマット文字列を活用できますが、丸めの副作用では不十分であることがわかりました"{:0.0f}"。次の例を確認してください...

>>> "{:0.0f}".format(1.999)
'2'
>>> "{:0.0f}".format(1.53)
'2'
>>> "{:0.0f}".format(1.500)
'2'
>>> "{:0.0f}".format(1.33)
'1'
>>> "{:0.0f}".format(0.501)
'1'
>>> "{:0.0f}".format(0.5)
'0'
>>> "{:0.0f}".format(0.1)
'0'
>>> "{:0.0f}".format(0.001)
'0'

ご覧のとおり、舞台裏では丸め動作があります。intをfloatに変換するデータベースを持っていた場合、事前に非小数部分を処理していることを知っていて、回避策としてfloatのint部分のみをHTMLテンプレートでレンダリングしたいと考えていました。もちろん、小数部分が事前にわからない場合は、最初にフロートで何らかの切り捨て操作を実行する必要があります。

于 2019-03-07T19:21:04.870 に答える
20

クラス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"
于 2012-11-22T13:49:11.467 に答える
17

これは機能します:

from math import trunc
some_float = 1234.5678

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

または、これを行うだけです。

print trunc(some_float)
=> 1234

私はそれが許容できる答えだと思います、それはへの変換を避けintます。このスニペットでは'%02d' % some_float、への暗黙の変換が行われていることに注意してintください。目的の形式で印刷するためのある種の変換を回避することはできません。

于 2012-11-22T11:25:21.940 に答える
-8

これも機能します:

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

%timeitテストを実行した後、これはtruncメソッドよりも少し高速であるように見えます。

于 2015-12-03T08:35:30.297 に答える