如何调整美元金额以便在C ++中匹配?

时间:2016-09-10 01:09:44

标签: c++ text-alignment

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

我们几周前才开始上课,所以我们还没有完成这项工作。我的教授说,如果他们不对齐,现在没关系,我想我只是OCD。另外,我觉得它看起来更清洁。

此外,如果该法案是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;

编辑:我&#34;已修复&#34;它。一切都很好。

3 个答案:

答案 0 :(得分:4)

如果您要打印钱,我建议您查看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::setwstd::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

答案 1 :(得分:1)

一种可能的方法是使用setw

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

output:
 4.55
44.55

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

答案 2 :(得分:1)

我会做类似的事情:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

    // ALL CHECKS OMMITTED!

typedef struct A_NewNumber {
  struct A_NewNumber *next;
  double newNum;
} NewNumber;


NewNumber *AddNumber(NewNumber * previous, char *input)
{
  int res;
  // allocate new node
  NewNumber *newNum = malloc(sizeof(NewNumber));

  if (newNum == NULL) {
    fprintf(stderr, "Malloc failed in AddNUmber()\n");
    return previous;
  }
  // convert input string to float
  res = sscanf(input, "%lf", &newNum->newNum);
  if (res != 1) {
    fprintf(stderr, "Something bad happend in AddNUmber()\n");
    return previous;
  }
  // terminate that node
  newNum->next = NULL;
  // if this is NOT the first node
  // put new node to the end of the list
  if (previous != NULL) {
    previous->next = newNum;
  }
  // return pointer to new node at end of the list
  return newNum;
}

void PrintList(NewNumber * start)
{
  NewNumber *currentNumber = start;
  int count = 0;

  while (currentNumber != NULL) {
    count++;
    printf("Numbers:%lf\n", currentNumber->newNum);
    currentNumber = currentNumber->next;
  }
  printf("Total Numbers Entered %d\n", count);
}

void CleanUp(NewNumber * start)
{
  NewNumber *freeMe = start;
  NewNumber *holdMe = NULL;

  while (freeMe != NULL) {
    holdMe = freeMe->next;
    free(freeMe);
    freeMe = holdMe;
  }
}

int main()
{
  char input[16];
  NewNumber *start = NULL;
  NewNumber *newest = NULL;
  int res;

  // infinite loop
  while (1) {
    // give advise
    printf("Please enter a number or\n");
    printf("'quit' to stop or 'print' to print/calculate\n");
    // get input from user
    res = scanf("%s", input);
    if (res != 1) {
      if (res == EOF) {
        fprintf(stderr, "Got EOF, bailing out\n");
        break;
      } else {
        fprintf(stderr, "something bad happend, bailing out\n");
        break;
      }
    }
    // check if a command was given
    if (strncmp(input, "print", 5) == 0) {
      PrintList(start);
      continue;
    } else if (strncmp(input, "quit", 4) == 0) {
      printf("\n\nQuitting....\n");
      break;
    }
    // otherwise gather numbers
    if (newest == NULL) {
      start = AddNumber(NULL, input);
      if (start == NULL) {
        fprintf(stderr, "AddNumber returned NULL\n");
        break;
      }
      newest = start;
    } else {
      newest = AddNumber(newest, input);
      if (newest == NULL) {
        fprintf(stderr, "AddNumber returned NULL\n");
        break;
      }
    }
  }
  CleanUp(start);
  return 0;
}

这为每个&#34;列设置输出的宽度&#34;至15个字符,因此您不必依赖标签。所有&#34;标签&#34;将是合理的,所有的价格都是正确的,并打印到2位小数。这比依赖选项卡更加强大,在这些选项卡中,您无法控制使用的字符数。您无法使用标签进行正确的调整。