printf: как выровнять числа по десятичной точке - PullRequest
0 голосов
/ 12 декабря 2018

рассмотреть возможность набора чисел:

my @array =   (
   1.788139343e-007, 0.0547055073198, -0.703213036125,
   -0.583665880391, -1.41198285298, +0.171879081676,
   -0.58966025098, -86.0627173425, -0.84449797709,
 3.49876623321e-005, 3.02660429162, -0.256948695361);

Я хотел бы выровнять десятичную точку по n-му столбцу общей ширины m (возможно, n = 6 и m = 25)

Если использовать %f, я получаю хорошо выровненные числа, но числа, которые требуют научной записи, уничтожаются.usging %g интерпретирует аргумент точности после точки как абсолютную точность, которая приводит к различным десятичным знакам после десятичной точки.И поскольку большинство чисел находится в диапазоне (-10, 10), я не хочу использовать научную запись %e

Есть ли какие-либо флаги или атрибуты формата (или их комбинации), которые я пропустил?

ожидаемый результат будет:

foreach my $f (@array){
  printf("[%+25.12g]$/", $f);
}


[   +1.788139343e-007     ]
[   +0.0547055073198      ]
[   -0.703213036125       ]
[   -0.583665880391       ]
[   -1.41198285298        ]
[   +0.0171879081676      ]
[   -0.58966025098        ]
[  -86.0627173425         ]
[   -0.84449797709        ]
[   +3.49876623321e-005   ]
[   +3.02660429162        ]
[   -0.256948695361       ]

или даже лучше

[   +1.7881393430000e-007 ]
[   +0.0547055073198      ]
[   -0.7032130361250      ]
[   -0.5836658803910      ]
[   -1.4119828529800      ]
[   +0.0171879081676      ]
[   -0.5896602509800      ]
[  -86.0627173425000      ]
[   -0.8444979770900      ]
[   +3.4987662332100e-005 ]
[   +3.0266042916200      ]
[   -0.2569486953610      ]

(вопрос о Perl, но строка формата s?printf довольно независима,поэтому я также добавил C тег)

1 Ответ

0 голосов
/ 12 декабря 2018

Функция [*]printf позволяет:

  • получить количество написанных символов,
  • добавить некоторые отступы.

Так что еслиВы знаете, сколько символов находится перед точкой (d = sprintf(buf, "%.0f", ar[i]);), вы можете выровнять точку, используя (printf("[%*s %g", 4-d, "", ar[i]);).

Затем примените ту же логику для выравнивания закрывающей скобки:

#include <stdio.h>

int main()
{
    double ar[] = {
        1.788139343e-007,   0.0547055073198, -0.703213036125,
       -0.583665880391,    -1.41198285298,    0.171879081676,
       -0.58966025098,    -86.0627173425,    -0.84449797709,
        3.49876623321e-005, 3.02660429162,   -0.256948695361};

    for (int i = 0; i < 12; ++i)
    {
        /* buffer to count how much character are before the dot*/
        char buf[64];

        /* how much before the dot? */
        int d = sprintf(buf, "%+.0lf", ar[i]);

        /* write float with aligned dot and store second padding */
        int e = printf("[%*s %+.15lg", 4-d, "", ar[i]);
        printf("%*s]\n", 25-e, "");

    }
    return 0;
}

Дает:

[   +1.788139343e-07     ]
[   +0.0547055073198     ]
[   -0.703213036125      ]
[   -0.583665880391      ]
[   -1.41198285298       ]
[   +0.171879081676      ]
[   -0.58966025098       ]
[  -86.0627173425        ]
[   -0.84449797709       ]
[   +3.49876623321e-05   ]
[   +3.02660429162       ]
[   -0.256948695361      ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...