#include <iomanip> #include <iostream> #include <locale> using namespace std; // MONETARY TYPES typedef long double MoneyVal; class Money { public: Money(MoneyVal v) : value(v) {} operator MoneyVal() const {return (value); } private: MoneyVal value; }; // Money INSERTER template<class _E, class _Tr> inline basic_ostream<_E, _Tr>& operator<<( basic_ostream<_E, _Tr>& _O, Money _Y) {typedef ostreambuf_iterator<_E, _Tr> _Iter; typedef money_put<_E, _Iter> _Mput; ios_base::iostate _St = ios_base::goodbit; const typename basic_ostream<_E, _Tr>::sentry _Ok(_O); if (_Ok) {try {const _Mput& _Fac = _USEFAC(_O.getloc(), _Mput); if (_Fac.put(_Iter(_O.rdbuf()), (_O.flags() & ios_base::showpos) != 0, _O, _O.fill(), _Y).failed()) _St |= ios_base::badbit; } catch (...) {_O.setstate(ios_base::badbit, true); }} _O.setstate(_St); return (_O); } // moneypunct FOR USA LOCALE money_base::pattern mon_fmt = { money_base::symbol, money_base::space, money_base::sign, money_base::value}; class Mymoneypunct : public moneypunct<char, false> { protected: virtual char do_decimal_point() const {return ('.'); } virtual char do_thousands_sep() const {return (','); } virtual string do_grouping() const {return (string("\3")); } virtual string do_curr_symbol() const {return (string("$")); } virtual string do_positive_sign() const {return (string("")); } virtual string do_negative_sign() const {return (string("-")); } virtual int do_frac_digits() const {return (2); } virtual pattern do_pos_format() const {return (mon_fmt); } virtual pattern do_neg_format() const {return (mon_fmt); } }; int main() {locale loc = _ADDFAC(locale::classic(), new Mymoneypunct); cout.imbue(loc); cout << showbase << setw(20) << internal << setfill('*') << Money(123456789.0) << endl; return (0); } //End of File