Выравнивание переменных printf() и десятичных знаков в C

Большая проблема с C сегодня. Поэтому я хочу, чтобы мои переменные выровнялись в столбцах и имели 2 десятичных знака одновременно.

Я знаю, чтобы получить 2 знака после запятой, мне нужно использовать%.2f, и если я хочу ширину, я использую%-30s. Но я не могу их объединить. Посмотрите мой код ниже, и вы поймете.

printf("ItemA                  %.2f @ $3.34                    $ %.2f\n", huhu, totalhuhu);
printf("ItemB                 %.2f @ $44.50                    $ %.2f\n", haha, totalhaha);

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

Спасибо людям.

2 ответа

Лично я бы избегал вкладок в выводе. Вы можете заставить выравнивание работать, если вы будете осторожны - в основном, используя одинаковую строку формата для каждого элемента. (Ваш выбор имен переменных затрудняет полную автоматизацию; у массивов структур есть свои преимущества.)

Если вы хотите форматирование с учетом валюты, посмотрите на strfmon() и помните, что программа на C работает в языке C, пока вы не установите другой язык, используя setlocale(),

Образец кода:

#include <stdio.h>
#include <locale.h>
#include <monetary.h>

int main(void)
{
    double huhu = 123.45;
    double haha = 234.56;
    double huhu_price = 3.34;
    double haha_price = 44.50;
    double totalhuhu = huhu * huhu_price;
    double totalhaha = haha * haha_price;
    char *huhu_name = "Item A";
    char *haha_name = "Much Longer Name";

    setlocale(LC_ALL, "");

    const char fmt[] = "%-30s %10.2f @ $%6.2f $%20.2f\n";
    printf(fmt, huhu_name, huhu, huhu_price, totalhuhu);
    printf(fmt, haha_name, haha, haha_price, totalhaha);

    char buffer1[32];
    char buffer2[32];
    const char p_fmt[] = "%-30s %10.2f @ %s %s\n";
    const char price[] = "%(7.2n";
    const char cost[]  = "%(21.2n";
    strfmon(buffer1, sizeof(buffer1), price, huhu_price);
    strfmon(buffer2, sizeof(buffer2), cost, totalhuhu);
    printf(p_fmt, huhu_name, huhu, buffer1, buffer2);
    strfmon(buffer1, sizeof(buffer1), price, haha_price);
    strfmon(buffer2, sizeof(buffer2), cost, totalhaha);
    printf(p_fmt, haha_name, haha, buffer1, buffer2);

    return 0;
}

Образец вывода:

Item A                             123.45 @ $  3.34 $              412.32
Much Longer Name                   234.56 @ $ 44.50 $            10437.92
Item A                             123.45 @   $3.34               $412.32
Much Longer Name                   234.56 @  $44.50            $10,437.92

Попробуй это:

    printf("ItemA\t\t%30.2f @ $3.34 \t\t$ %30.2f\n", huhu, totalhuhu);
    printf("ItemB\t\t%30.2f @ $44.50\t\t$ %30.2f\n", haha, totalhaha);

\ T - это вкладки для сохранения одинакового расстояния. Вы можете добавлять столько, сколько хотите, пока вам это не понравится, и%30.2f даст вам ширину 30 до десятичной запятой и ширину 2 после. Это должно дать вам желаемые результаты для пробелов.

Другие вопросы по тегам