struct Currency {
static char const sep = ' ';
static int const group_size = 3;
Currency(int val, std::string unit)
: val(val), unit(unit)
{}
friend std::ostream& operator<<(std::ostream& out, Currency const& v) {
// currently ignores stream width and fill
std::ostringstream ss;
bool const neg = v.val < 0;
int const val = (neg ? -v.val : v.val);
if (neg) out << '-';
ss << val;
std::string const s = ss.str();
std::string::size_type n = s.size() % v.group_size;
if (n) out << s.substr(0, n);
for (; n < s.size(); n += v.group_size) {
out << sep << s.substr(n, v.group_size);
}
out << ' ' << v.unit;
return out;
}
private:
int val;
std::string unit;
};
Может сделать нестандартные члены sep и group_size, если вы хотите настроить каждый объект с запятой и т. Д. (Если это так, сделайте их закрытыми и инициализируйте в ctor, возможно, со значениями параметров по умолчанию.) Вы также можете использовать класс черт, управляющий форматированием вывода.
Локали также поддерживают форматирование валюты через фасет moneypunct.