2012-06-07 1 views
0

Я уверен, что делаю это правильно, но не получаю ожидаемых результатов от мини-языка Python 2.7.3. Я пытаюсь отформатировать вывод float до 3 целых значений и различного количества десятичных значений. Все работает, кроме целочисленных значений.Форматирование строки с плавающей запятой Python не работает

Сам по себе следующий код работает, чтобы получить меня 3 целочисленных значений ...

num = 3 
value = '{:03}'.format(num) 

returns '003' 

И плавает работа ...

num = 3.12345 
value = '{:01.2f}'.format(num) 

returns '3.12' 

Однако, комбинируя два, кажется, не работает должным образом. Десятичная точность работы, но целочисленной точности не ...

num = '3.12345' 
value = '{:03.2f}'.format(num) 

returns '3.12' 

instead of the expected '003.12' 

То же самое справедливо, если я попробовать любой из следующих форматов ...

value = '{:03.02f}'.format(num) 
- or - 
value = '{0:3.2f}'.format(num) 
- or - 
value = '{:3.02f}'.format(num) 
- or - 
value = '{0:3.02f}'.format(num) 
- or - 
value = '{0:03.2f}'.format(num) 
- or - 
value = '{0:03.02f}'.format(num) 
- or - 
value = '{:0>3.2f}'.format(num) 
etc... 

Which all return the same '3.12' instead of '003.12' 

Если вы хотите знать, что Я делаю для переменной/динамической десятичной точности, необходимо сохранить все значения одинаковой длины, но разные наборы значений могут не иметь такой же точности. Итак, я беру меньше самого длинного точности значения или 10 и заставить других, чтобы соответствовать, как это ..

from decimal import Decimal 

dVals = [ 
    abs(Decimal(val1).as_tuple().exponent), # Get the number of decimal points 
    abs(Decimal(val2).as_tuple().exponent), # "" "" 
    abs(Decimal(val3).as_tuple().exponent), # "" "" 
    abs(Decimal(val4).as_tuple().exponent), # "" "" 
    ] 

    p = max(dVals) # Get the largest value 
    p = min(p, 10) # Get the smaller of the largest value or 10 

vals = [val1, val2, val3, val4] 

for val in vals: 
    value = '{:0>3.{prec}f}'.format(val, prec = p) 
    # do whatever with value here... 

Опять же, это все работает отлично, за исключением того, что целое значение никогда не возвращается с 3 точных мест, когда я совмещаю с плавающей точностью. Поэтому все мои усилия по обеспечению вывода значений с одинаковой форматированной длиной все напрасны. В конечном счете, результат должен выглядеть примерно так ...

'009.123456700' 
'180.101010101' 
'054.987654321' 

Вместо этого он выглядит следующим образом ...

'9.123456700' 
'180.101010101' 
'54.987654321' 

Другими словами, некрасиво. : - |

По крайней мере, я бы принял следующий вывод ...

' 9.123456700' 
'180.101010101' 
' 54.987654321' 

Любые идеи, что я делаю неправильно здесь? Ваша помощь очень ценится!

Привет,

-RMWChaos

+0

Вы должны попытаться укрепить свой вопрос сложнее ... – KurzedMetal

+0

А, да, я склонен быть немного плодовитым мышлением больше информации лучше. Я сокращу свои вопросы в будущем. Благодаря! – RMWChaos

ответ

5

Первая цифра общая ширина результата, а не ширина перед десятичной точкой.

>>> '{:06.2f}'.format(3.12345) 
'003.12' 
+1

'Первая цифра - это общая ширина результата, включая точку. – KurzedMetal

+0

Да, все. Первая цифра - это общая длина вывода, включая десятичную точку, а не только длину целочисленной части значения. : facepalm: Спасибо! – RMWChaos

0
num = '3.12345' 
value = '{:03.2f}'.format(num) 

Здесь 03 учитывает все цифры (в том числе самого с плавающей точкой). так что вы должны сделать что-то вроде этого:

value = '{:06.2f}'.format(num) 

это поможет вам: '003.12'

считать все, что в этой строке '003.12', результат 6.Но вы использовали 3, что даже меньше, чем количество минимального представления, поэтому вы получили '3.12'

Смежные вопросы