3

我有一个函数,它接受一个双精度并将其作为带有千位分隔符的字符串返回。你可以在这里看到它:c++:用逗号格式化数字?

#include <iomanip>
#include <locale>

template<class T>
std::string FormatWithCommas(T value)
{
    std::stringstream ss;
    ss.imbue(std::locale(""));
    ss << std::fixed << value;
    return ss.str();
}

现在我希望能够将其格式化为带有美元符号的货币。具体来说,如果给定 20500 的两倍,我想得到一个字符串,例如“$20,500”。

在负数的情况下添加美元符号不起作用,因为我需要“-$5,000”而不是“$-5,000”。

4

3 回答 3

5
if(value < 0){
   ss << "-$" << std::fixed << -value; 
} else {
   ss << "$" << std::fixed << value; 
}
于 2012-12-04T23:48:59.867 回答
3

我认为你唯一能做的就是

ss << (value < 0 ? "-" : "") << "$" << std::fixed << std::abs(value);

您需要使用千位分隔符打印特定的语言环境。

于 2012-12-04T23:48:07.343 回答
1

这是我用来学习从此处提取的格式化货币的示例程序。试着把这个程序分开,看看你能用什么。

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

using namespace std;

void showCurrency(double dv, int width = 14)
{
    const string radix = ".";
    const string thousands = ",";
    const string unit = "$";
    unsigned long v = (unsigned long) ((dv * 100.0) + .5);
    string fmt,digit;
    int i = -2;
    do {
        if(i == 0) {
            fmt = radix + fmt;
        }
        if((i > 0) && (!(i % 3))) {
            fmt = thousands + fmt;
        }
        digit = (v % 10) + '0';
        fmt = digit + fmt;
        v /= 10;
        i++;
    }
    while((v) || (i < 1));
    cout << unit << setw(width) << fmt.c_str() << endl;
}

int main()
{
    double x = 12345678.90;
    while(x > .001) {
        showCurrency(x);
        x /= 10.0;
    }
    return 0;
}
于 2012-12-04T23:49:39.743 回答