2016-10-26 6 views
2

浮動小数点数をnn.nn文字列に正規化し、数値が範囲外の場合に特別な処理をしたいとします。 .formatは黙って5文字の幅をオーバーフロー:それは動作しません除いデータがフィールドに収まらない場合、Python .format()を例外にする方法はありますか?

try: 
    norm = '{:5.2f}'.format(f) 
except ValueError: 
    norm = 'BadData' # actually a bit more complex than this 

。明らかに私はnormの長さをチェックして、独自のValueErrorを上げることができましたが、フィールド幅のオーバーフローで例外を発生させるような書式(または古い%書式)を強制する方法がありませんでしたか?

+1

あなたがサンプル例を与えることによって、より明確にすることはできますか? –

+0

何か? format(12.0) 'は' 12.00'を返しますが、 ''{:5.2f}' 'はフォーマットされた文字列の長さが1001.00を返します。データが5桁の小数点以下2桁に収まらない場合は、例外を発生させたい。 – nigel222

+1

私はあなた自身: 'math.log10(value)> = 3.0'が数学的な方法であるかどうかを調べなければならないと思います。文字列の長さを調べる。 –

答えて

0

format()でこれを達成することはできません。例外を発生させるカスタムフォーマッタを作成する必要があります。たとえば:

def format_float(num, max_int=5, decimal=2): 
    if len(str(num).split('.')[0])>max_int: 
     raise ValueError('Integer part of float can have maximum {} digits'.format(max_int)) 
    return "{:.2f}".format(num) 

サンプル実行:

>>> format_float(123.456) 
'123.46' 

>>> format_float(123.4) 
'123.40' 

>>> format_float(123789.456) # Error since integer part is having length more than 5 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 3, in format_float 
ValueError: Integer part of float can have maximum 5 digits 
関連する問題