2015-09-27 11 views
5

をAllignまあまあのように、私は、彼らが小数点に合わせるように、数値をフォーマットする必要があります。の書式番号彼らは、Pythonの小数点で

4.8 
49.723 
456.781 
-72.18 
    5 
13 

はこれを行うにはstraighforward方法はありますか?

+0

関連:https://stackoverflow.com/questions/1025379/decimal-alignment-formatting-in-python – Caramiriel

答えて

3

私はしないあなたが印刷を開始する前に、すべての数字の小数点の位置を知る必要があるので、それを行うには簡単な方法があります。 (私はちょうどCaramirielのリンクを見て、そのページからのリンクのいくつかが、私はこの事件に特に適用される何かを見つけることができませんでした)。

したがって、文字列ベースの検査&のリスト内の数字の操作が必要なようです。例えば、

def dot_aligned(seq): 
    snums = [str(n) for n in seq] 
    dots = [s.find('.') for s in snums] 
    m = max(dots) 
    return [' '*(m - d) + s for s, d in zip(snums, dots)] 

nums = [4.8, 49.723, 456.781, -72.18] 

for s in dot_aligned(nums): 
    print(s) 

出力

4.8 
49.723 
456.781 
-72.18 

あなたが混入いくつかの平野int sのfloatのリストを処理したい場合は、このアプローチは、ビット乱雑を取得します。

def dot_aligned(seq): 
    snums = [str(n) for n in seq] 
    dots = [] 
    for s in snums: 
     p = s.find('.') 
     if p == -1: 
      p = len(s) 
     dots.append(p) 
    m = max(dots) 
    return [' '*(m - d) + s for s, d in zip(snums, dots)] 

nums = [4.8, 49.723, 456.781, -72.18, 5, 13] 

for s in dot_aligned(nums): 
    print(s) 

出力

4.8 
49.723 
456.781 
-72.18 
    5 
13 

更新

マーク身代金はコメントで指摘するように、我々は.splitを使用してintの取り扱い簡素化することができます:

def dot_aligned(seq): 
    snums = [str(n) for n in seq] 
    dots = [len(s.split('.', 1)[0]) for s in snums] 
    m = max(dots) 
    return [' '*(m - d) + s for s, d in zip(snums, dots)] 
+0

代わりs.find 'の(」。 ') 'len(s.split('。 ')[0])'を使うことができます。 –

+0

@ MarkRansom:なぜ、私はそれを考えなかったのですか? :)ありがとう! –

0

あなたはこの使用できるいくつかの先行ゼロ受け入れることができる場合:

Decimal alignment formatting in Python

しかし最高:あなたがゼロを招くことなく好む場合は、この方法で正規表現を使用することができます

numbers = [ 4.8, 49.723, 456.781, -72.18] 
    for x in numbers: 
    print "{:10.3f}".format(x) 

をソリューションは、小数点の前後の文字列を別々にフォーマットする必要があります(numstring割り当て)。

numbers = [ 4.8, 49.723, 456.781, -72.18] 
nn = [str(X) for X in numbers] 

for i in range(len(nn)): 
    numstring = "{value[0]:>6}.{value[1]:<6}" 
    print numstring.format(value=nn[i].split('.') if '.' in nn[i] else (nn[i], '0')) 

次に、文字列を小数点で全体と小数部に分割できます。小数部がない場合は0に割り当てます。

注:このソリューションでは、フォーマット操作の前に数値を文字列に変換する必要があります。

これが出力されます。

4.8 
49.723 
456.781 
-72.18 

編集:私はFeebleOldManのsolutionは私よりも優れている、あなたがそれを選ぶべきだと思います。小数点以下の桁数

2

修正要求に考慮に幅を取るために修正さ

import decimal 

numbers = [4.8, 49.723, 456.781, 50, -72.18, 12345.12345, 5000000000000] 

dp = abs(min([decimal.Decimal(str(number)).as_tuple().exponent for number in numbers])) 
width = max([len(str(int(number))) for number in numbers]) + dp + 1 #including . 

for number in numbers: 
    number = ("{:"+str(width)+"."+str(dp)+"f}").format(number) 
    print number.rstrip('0').rstrip('.') if '.' in number else number 

numbers = [4.8, 49.723, 456.781, 50, -72.18] 
width = max([len(str(number)) for number in numbers]) + 1 
for number in numbers: 
    number = ("{:"+str(width)+".4f}").format(number) 
    print number.rstrip('0').rstrip('.') if '.' in number else number 

EDIT:あなたは整数

numbers = [4.8, 49.723, 456.781, 50, -72.18] 

for number in numbers: 
    number = "{:10.4f}".format(number) 
    print number.rstrip('0').rstrip('.') if '.' in number else number 
を含める場合
numbers = [4.8, 49.723, 456.781, -72.18] 

for number in numbers: 
    print "{:10.4f}".format(number).rstrip('0') 
+0

これは、左のオフセットを気にしないときのための優れた軽量ソリューションです。 – mcu

+0

@ coding4fun左のオフセットを考慮に入れてコードを編集しました。 – ooknosi

+0

最新のバージョンにバグがあります。 'numbers = [4.8、49.723、456.781、50、-72.18、12345.12345]'で試してください。ありがとう。 – mcu

0

あなたは、Python [decimal][1]タイプを使用することができます。

金額の書式設定にはrecipeが使用されています。 Pythonのドキュメントのレシピを使用して、丸めの問題を避けるため、正しくシニフィアン数字を扱う...

+0

この質問に関連する例を表示できますか? decimal型を使用して小数点に揃えられた数値のリストを適切にフォーマットする方法を理解できませんでした。 –

+0

はい、できますが、レシピを読んでもらえますか? –

+1

私はゼロを導くことを避ける必要があることを理解しました。いずれにしても、[ここ](http://meta.stackoverflow.com/questions/251070/are-multiple-answers-by-theame-user-acceptable?rq=1)に記載されているように、複数の回答を避けるべきだと思います。 )。 –

0

なぜdecimalタイプhttps://docs.python.org/2/library/decimal.html#recipes

from decimal import Decimal 


def moneyfmt(value, places=3, curr='', sep=',', dp='.', 
      pos='', neg='-', trailneg=''): 
    [...] 

numbers = [4.8, 49.723, 456.781, -72.18] 
for x in numbers: 
    value = moneyfmt(Decimal(x), places=2, pos=" ") 
    print("{0:>10s}".format(value)) 

あなたが取得されます:

4.800 
49.723 
456.781 
-72.180 
+0

ええと、このコードはそのままでは動作しません - Python 3.4.3。 * TypeError:オブジェクトに渡される空でない書式文字列.__形式__ * – mcu

+0

Py3を使用する場合は、Py3のドキュメントを参照してください。https://docs.python.org/3/library/decimal.html#recipes –

0

私はこれに非常に遅れていますが、数学、特に対数の性質を使って、あなたの空間の量を計算することもできますすべての数字を適切な小数点以下の桁に貼り付けます。

from math import log10 

nums = [4.8, 49.723, 456.781, -72.18, 5, 13] 

def pre_spaces(nums): 
    absmax = max([abs(max(nums)), abs(min(nums))]) 
    max_predot = int(log10(absmax)) 
    spaces = [' '*(max_predot-int(log10(abs(num))) - (1 if num<0 else 0)) for num in nums] 
    return spaces 

for s,n in zip(pre_spaces(nums), nums): 
    print('{}{}'.format(s,n)) 

結果は次のとおりです。

4.8 
49.723 
456.781 
-72.18 
    5 
13