c ++:如何使用美元符号将double格式化为货币?

时间:2012-12-04 23:44:51

标签: c++ string string-formatting currency dollar-sign

我有一个带有double的函数,并将其作为带有千位分隔符的字符串返回。你可以在这里看到它:c++: Format number with commas?

#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();
}

现在我希望能够将其格式化为带有美元符号的货币。具体来说,我希望获得一个字符串,如&#34; $ 20,500&#34;如果给出20500的双倍。

在负数的情况下,预先设置一个美元符号并不起作用,因为我需要&#34; - $ 5,000&#34;不是&#34; $ - 5,000&#34;。

3 个答案:

答案 0 :(得分:4)

if(value < 0){
   ss << "-$" << std::fixed << -value; 
} else {
   ss << "$" << std::fixed << value; 
}

答案 1 :(得分:2)

我认为你唯一能做的就是

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

您需要使用千位分隔符打印特定的区域设置。

答案 2 :(得分:1)

以下是我用来了解从here提取的格式化货币的示例程序。尝试分开选择这个程序,看看你能用什么。

#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;
}