2013-08-17 4 views
1

Я экспериментировал с sprintf, пытаясь исправить количество цифр справа от десятичной точки, а также слева.Форматирование фиксированного десятичного скаляра

Следующие работы, но не обрабатывают 0,00 скважины. Как вы можете видеть, 0.00 не выравнивается правильно, как и все другие ненулевые десятичные значения.

sprintf("%.2f ", $sw_chgs)

535.14 642.90 20.31 1198.35 
442.74 531.90 20.31 994.95 
0.00 0.00 0.00 0.00 

В случае если добавить ширину поля или обозначение как% 6f к Sprintf, «2f» печатается после десятичного знака.

sprintf("%6f.2f ", $ws_chgs

244.100000.2f

Я хочу сделать что-то вроде следующего, который ограничивает целое число в ширину поля

sprintf("%6d ", $prev_rd)

Это возможно с десятичным значением?

ответ

4

Вы неправильно поняли формат printf форматов. Это примерно так:

"%" <padding>? <minimum width>? "." <precision>? <type> 

E.g. %7.2f. Затем этот код

say join " : ", map sprintf('%7.2f', $_), @$_ for 
    [ 535.14, 642.90, 20.31, 1198.35 ], 
    [ 442.74, 531.90, 20.31, 994.95 ], 
    [ 0.00, 0.00, 0.00, 0.00 ], 
; 

печатает

535.14 : 642.90 : 20.31 : 1198.35 
442.74 : 531.90 : 20.31 : 994.95 
    0.00 : 0.00 : 0.00 : 0.00 

Обратите внимание, что ширина мин включает в себя десятичный разделитель.

Аргументы ширины и точности не включают тип f. Поэтому ваш %6f.2f анализируется как шаблон %6f, который предшествует неспецифической строке .2f.

+0

всегда красноречиво и до точки ответа –

3

Принять к сведению, 6 этого число всех символов вместе в отформатированной строке,

sprintf("%06.2f ", 1); 

выхода

001.00 

или без ведущих нулей,

sprintf("%6.2f ", 1); 

выхода

1.00 
+1

sprintf ("% 6.2f", 1); если никакого начального нулевого заполнения не требуется –

+0

@MiguelPrz tnx для комментариев –

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