2013-02-18 7 views
7

:問題は桁の与えられた数の数をフォーマットされ可変数

def percent(value,digits=0): 
    return ('{0:.%d%%}' % digits).format(value) 

>>> percent(0.1565) 
'16%' 

>>> percent(0.1565,2) 
'15.65%' 

、私は両方を使用して好きではありません " % '演算子と書式メソッドです。

+2

をあなたはそれを好きではありませんか?私にはうまく見える? – Aesthete

+3

@Aesthete:いいえ、私はそれが好きではありません。 –

答えて

20

私はこの1つが好き

>> '{0:.{1}%}'.format(0.1565, 0) 
'16%' 
>> '{0:.{1}%}'.format(0.1565, 2) 
'15.65%' 
+0

+1私はそれも好きです – Volatility

+0

+1 - それはどのように記述されますか? @ [format-spec](http://docs.python.org/2/library/string.html#formatspec)を簡単に見ています。入れ子にされたformatspecsを持つのは間違いありません。 – sotapme

+3

@sotapme - あなたのリンクされたページに "入れ子になった"という単語を検索します。 – eumiro

2

* does what you wantprintf-スタイル文字列の書式設定です。

>>> def percent(value, digits=0): 
...  return '%.*f%%' % (digits, value * 100) 
... 
>>> percent(0.1565, 2) 
'15.65%' 

高度な文字列フォーマット(7.1.3. Format String SyntaxPEP 3101で定義され、文書化)は、1回のパスでこれを行うことが可能ではないようです。 (7.1.3.1. Format Specification Mini-Language参照:precisionのみintegerである。)

+0

これは、1回のパスでこれを行うことができます。私の答えを見てください。 – eumiro

+0

精度は数字の桁数を示します。もちろん_it_は整数ですが、浮動小数点数に_applied_することができます –

+0

@gnibbler:私は文法を参照していました: 'precision :: = integer' –

1

docsから:

最小フィールド幅(オプション)。 '*'(アスタリスク)として指定された場合、 実際の幅は値のタプルの次の要素から読み取られ、 変換するオブジェクトは最小のフィールド幅の後に来る(オプションで 精度)。

例:

'{0:.{1}%}'.format(value, digits) 

テスト:

def percent(value, digits=0): 
    print '%.*f%%' % (digits, value*100) 
>>> percent(0.1565, 2) 
15.65%