У меня есть функция, которая принимает double и возвращает его в виде строки с тысячами разделителей. Вы можете видеть это здесь: 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();
}
Теперь я хочу иметь возможность отформатировать его как валюту со знаком доллара. В частности, я хочу получить строку, например, «20 500 долларов», если получить двойное значение 20500.
Предварительный знак доллара не работает в случае отрицательных чисел, потому что мне нужно «- $ 5000», а не «-5000».
if(value < 0){
ss << "-$" << std::fixed << -value;
} else {
ss << "$" << std::fixed << value;
}
Я думаю, что единственное, что вы можете сделать, это
ss << (value < 0 ? "-" : "") << "$" << std::fixed << std::abs(value);
Вам нужно указать конкретную локаль для печати с разделителями тысяч.
Вот пример программы, которую я использовал, чтобы узнать о форматировании валюты, извлеченной из Вот. Попробуйте выбрать эту программу и посмотреть, что вы можете использовать.
#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;
}