【问题标题】:How do I align dollar amounts so cents match up in C++?如何对齐美元金额以使美分在 C++ 中匹配?
【发布时间】:2017-01-18 04:38:33
【问题描述】:

我的程序执行得很好,但我想知道如何调整我的输出以便美分而不是美元排列。

我们几周前才开始上课,所以我们还没有讨论这个问题。我的教授说,如果他们不对齐,现在没关系,我想我只是对此有强迫症。另外,我觉得它看起来更干净。

另外,如果账单是 38.40 美元,那会是四位有效数字吗?抱歉,我好久没学数学了。在我的输出中,出于某种原因,我得到了多达五个有效数字。我最多的是四个。我该如何解决这个问题,使用 setprecision?

cout << "Bill \t \t   $  " << bill << endl;
cout << "Tax at 10.5% \t \t $"<<tax<< endl;
cout << "Sub-total \t \t $"<<subTotal<< endl;
cout << "Tip at 20% \t \t $"<<tip<< endl;
cout << endl;
cout << "Total Bill \t \t \t $"<<totalBill<< endl;

如您所见,我一直在尝试使用制表符转义。正如回复所暗示的,我应该使用 setw?

9/10 编辑:

我已将所有美元金额四舍五入到小数点后两位,但账单除外,我不知道如何解决。感谢您提供给我的所有信息,但是对于我们现在正在做的事情来说它太先进了,所以我只是手动对齐了一些东西。我仍然需要添加 setw,然后修复所有内容。我只是问为什么账单只有三位数。这可能是我想不到的超级简单的事情。

 // Declare variables
double bill, tax, subTotal, tip, totalBill;

// Variables
bill = 38.40;
tax = .105;
tip = .20;

// Calculate the tax
tax = bill * .105;

// Calculate sub-total of bill
subTotal = bill + tax;

// Calculate tip
tip = subTotal * .20;

// Calculate total amount of bill
totalBill = subTotal + tip;

cout << "Bill" "         $ " << setprecision(4) << bill << endl;
cout << "Tax at 10.5%" " $ " << setprecision(3) << tax << endl;
cout << "Sub-total" "    $ " << setprecision(4) << subTotal << endl;
cout << "Tip at 20%" "   $ " << setprecision(3) << tip << endl;
cout << endl;
cout << "Total Bill" "   $ " << setprecision(4) << totalBill << endl;

编辑:我“修复”了它。现在一切都很好。

【问题讨论】:

  • stackoverflow.com 上的问题必须在消息本身中包含所有完整和相关的问题,而不是指向可能随时停止工作的某些外部网站的链接,从而使问题变得毫无意义。您需要编辑您的问题,删除该链接,并将其替换为相关信息。此外,“我如何将我的代码改为执行 X”形式的问题显然必须显示代码,除非你愿意等到我们所有的通灵者从午休时间回来,并且能够查看你的代码以便我们弄清楚要对其进行哪些更改。
  • 减去不必要的讽刺,谢谢。我是新手,我试图在没有链接的情况下这样做,但它不会让我这样做。我会编辑它。另外,我认为没有必要有代码,因为它执行得很好,但我明白你在说什么。
  • @SamVarshavchik 我喜欢你的评论。经常出现讨厌的“这个问题质量低,应该关闭”的话。相反,你让我微笑。
  • @TrevorHickey 您帮了很多忙,想知道您是否可以帮助解决另一个快速问题。我编辑了我的帖子,补充说我已经手动对齐了所有内容(我仍然需要添加 setw),并且除了账单之外,我的美元金额已经四舍五入。我不明白为什么只有三位数。更改 setprecision 没有任何作用。
  • @deW1 你也帮忙了,谢谢。上面的回复也适合你。

标签: c++ text-alignment


【解决方案1】:

一种可能的方法是使用setw。

cout<<setw(5)<<4.55<<endl;
cout<<setw(5)<<44.55<<endl;

output:
 4.55
44.55

更新: 正如 Jonathan Leffler 指出的那样,&lt;&lt; 运算符会重置宽度,因此代码会更新以显示应该重复。

【讨论】:

  • 好的,谢谢。我会在我们的书中查看它是如何使用的。我只查了 setprecision。
  • 例如,如果您需要 10 的宽度,您仍然会遇到对齐问题。第一个数字将具有该宽度;第二个不会。碰巧这里选择的数字可以正常工作,但是将 44.55 更改为 -44.55 或 444.55 会出现对齐问题。
  • @JonathanLeffler,你是对的,错过了第二组!
【解决方案2】:

如果您要印钞票,我建议您查看 C++ 的 money I/O。
std::put_money 将确保您符合国际标准并以正确的舍入/精度进行打印。

为美元设置std::cout 的区域设置。
std::showbase 将决定是否打印$。

  //settings for printing as USD
  std::cout.imbue(std::locale("en_US.utf8"));
  std::cout << std::showbase;

使用std::setw 和std::left 进行格式化。
这是打印数据的示例:

#include <iostream>
#include <string>
#include <iomanip>  

//row data from example
struct Row{
  std::string description;
  float amount;
};

//function for printing a row
void Print(Row row);

int main(){

  //example rows
  Row a{"Bill",3840};
  Row b{"Tax at 10.5%",403};
  Row c{"Sub-total",4243};
  Row d{"Tip at 20%",848};
  Row e{"Total Bill",5091};

  //settings for printing as USD
  std::cout.imbue(std::locale("en_US.utf8"));
  std::cout << std::showbase;

  //format printing
  Print(a);
  Print(b);
  Print(c);
  Print(d);
  std::cout << '\n';
  Print(e);
}

void Print(Row row){
  static const int COLUMN_WIDTH{14};
  std::cout << std::setw(COLUMN_WIDTH) << std::left << row.description;
  std::cout << " " << std::right << std::put_money(row.amount) << '\n';
}

结果:

Bill           $38.40
Tax at 10.5%   $4.03
Sub-total      $42.43
Tip at 20%     $8.48

Total Bill     $50.91

【讨论】:

  • 虽然我很欣赏所有这些信息,但对于我需要做的事情来说,这有点先进。我们还没有涵盖你提供的很多内容,所以我怀疑我们是否需要它。我可以使用 setprecision 来获得有效数字的数量到我需要的位置,我只是想知道为什么在最多只使用四个时它打印出五个。我只声明了最多四个 sig。无花果。感谢您的 setw 信息。我刚刚看了我们的书,它更加简化了。我还需要再读几遍才能理解。
  • @Alexa 没问题。我想留下一个关于应该如何为生产代码完成的描述性答案。对于学校作业来说,这很可能是矫枉过正。
  • 是的,很高兴知道以备将来使用。一旦我们走到那一步,我肯定会回到这个。
  • @Alexa 我写了一个更简单的版本,我不打算分享它,但也许这有助于你澄清一些事情?相关部分是输出coliru.stacked-crooked.com/a/2007dfd9af340f87 btw。 +1 Trevor ty 毁了我的回答:p
【解决方案3】:

我会这样做:

std::cout << std::setw(15) << std::left << "Bill";
std::cout << std::setw(15) << std::right << std::fixed << std::setprecision(2) << bill << std::endl;

std::cout << std::setw(15) << std::left << "Tax @ 10.5%";
std::cout << std::setw(15) << std::right << std::fixed << std::setprecision(2) << tax << std::endl;

这会将每个“列”的输出宽度设置为 15 个字符,因此您不必依赖制表符。所有“标签”都将左对齐,所有价格都将右对齐并打印到小数点后 2 位。这比依靠制表符更强大,因为制表符无法控制使用多少字符。您无法使用制表符进行适当的调整。

【讨论】:

    猜你喜欢
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 2019-03-17
    • 2020-10-09
    • 2011-07-31
    • 1970-01-01
    相关资源
    最近更新 更多