C ++格式cout,带有“ right”和setw()的字符串和浮点数

时间:2018-12-03 07:52:14

标签: c++ string setw

我正在尝试格式化必须显示如下内容的'cout':

Result       $ 34.45

金额($ 34.45)必须在正确的索引上,并带有一定的填充量或在某些列位置处结束。我尝试使用

cout << "Result" << setw(15) << right << "$ " << 34.45" << endl;

但是,它是为“ $”字符串设置宽度,而不是为字符串加数量设置宽度。

关于处理这种格式的任何建议吗?

3 个答案:

答案 0 :(得分:3)

您需要将“ $” 和值 34.45 组合到单独的字符串中。尝试这样:

#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
using namespace std;

int main()
{
    stringstream ss;
    ss << "$ " << 34.45;

    cout << "Result" << setw(15) << right << ss.str() << endl;
}

答案 1 :(得分:2)

您尝试将格式修饰符应用于两个不同类型的参数(字符串文字和double),这些参数无法解决。要同时设置"$ "和数字的宽度,您需要先将两者都转换为字符串。一种方法是

 std::ostringstream os;
 os << "$ " << 34.45;
 const std::string moneyStr = os.str();

 std::cout << "Result" << std::setw(15) << std::right << moneyStr << "\n";

这是冗长的,所以您可以将第一部分放在帮助函数中。另外,std::ostringstream格式可能不是最佳选择,您也可以看看std::snprintf(重载4)。

答案 2 :(得分:0)

另一种选择是使用std::put_money

#include <iostream>
#include <locale>
#include <iomanip>

void disp_money(double money) {
    std::cout << std::setw(15) << std::showbase << std::put_money(money*100.)<< "\n";
}

int main() {
    std::cout.imbue(std::locale("en_US.UTF-8"));
    disp_money(12345678.9);
    disp_money(12.23);
    disp_money(120.23);
}

输出

 $12,345,678.90
         $12.23
        $120.23