1

今天C语言的大问题。所以我希望我的变量在列中对齐并同时保留 2 个小数位。

我知道要达到小数点后 2 位,我需要使用 %.2f,如果我想要一个宽度,我使用 %-30s。但我不能把它们结合起来。看看我下面的代码,你就会明白了。

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

huhu, totalhuhu, haha​​, totalhaha 都是浮点数。我希望项目下的项目,价格与价格一致,并且总数下的总数是否一致,无论 1 个总数的位数是否多于另一个。

谢谢人们。

4

2 回答 2

3

就个人而言,我会避免在输出中使用标签。如果你小心的话,你可以让对齐工作——主要是通过对每个项目使用相同的格式字符串。(您选择的变量名使得完全自动化变得更加困难;结构数组有优势。)

如果您想要对货币敏感的格式,请查看该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
于 2013-10-05T21:21:35.220 回答
1

尝试这个:

    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 的宽度。这应该为您提供所需的间距结果。

于 2013-10-05T20:36:20.143 回答