Listing 1: Inserting a monetary amount

#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