[locale.moneypunct.general]

# 28 Text processing library [[text]](./#text)

## 28.3 Localization library [[localization]](localization#locale.moneypunct.general)

### 28.3.4 Standard locale categories [[locale.categories]](locale.categories#locale.moneypunct.general)

#### 28.3.4.7 The monetary category [[category.monetary]](category.monetary#locale.moneypunct.general)

#### 28.3.4.7.4 Class template moneypunct [[locale.moneypunct]](locale.moneypunct#general)

#### 28.3.4.7.4.1 General [locale.moneypunct.general]

[ð](#lib:moneypunct)

namespace std {class money_base {public:enum part { none, space, symbol, sign, value }; struct pattern { char field[4]; }; }; template<class charT, bool International = false>class moneypunct : public locale::facet, public money_base {public:using char_type = charT; using string_type = basic_string<charT>; explicit moneypunct(size_t refs = 0);

 charT decimal_point() const;
 charT thousands_sep() const;
 string grouping() const;
 string_type curr_symbol() const;
 string_type positive_sign() const;
 string_type negative_sign() const; int frac_digits() const;
 pattern pos_format() const;
 pattern neg_format() const; static locale::id id; static const bool intl = International; protected:~moneypunct(); virtual charT do_decimal_point() const; virtual charT do_thousands_sep() const; virtual string do_grouping() const; virtual string_type do_curr_symbol() const; virtual string_type do_positive_sign() const; virtual string_type do_negative_sign() const; virtual int do_frac_digits() const; virtual pattern do_pos_format() const; virtual pattern do_neg_format() const; };}

[1](#1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L4465)

The moneypunct<> facet defines monetary formatting parameters
used by money_get<> and money_put<>[.](#1.sentence-1)

A monetary format is a sequence of four components,
specified by a pattern value p,
such that the part value static_cast<part>(p.field[i]) determines the ith component of the format[.](#1.sentence-2)[230](#footnote-230 "An array of char, rather than an array of part, is specified for pattern​::​field purely for efficiency.")

In the field member of a pattern object,
each value symbol, sign, value, and
either space or none appears exactly once[.](#1.sentence-3)

The value none, if present, is not first;
the value space, if present, is neither first nor last[.](#1.sentence-4)

[2](#2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L4484)

Where none or space appears,
whitespace is permitted in the format,
except where none appears at the end,
in which case no whitespace is permitted[.](#2.sentence-1)

The value space indicates that
at least one space is required at that position[.](#2.sentence-2)

Where symbol appears,
the sequence of characters returned by curr_symbol() is permitted, and
can be required[.](#2.sentence-3)

Where sign appears,
the first (if any) of the sequence of characters returned bypositive_sign() or negative_sign() (respectively as the monetary value is non-negative or negative) is required[.](#2.sentence-4)

Any remaining characters of the sign sequence are required after
all other format components[.](#2.sentence-5)

Where value appears, the absolute numeric monetary value is required[.](#2.sentence-6)

[3](#3)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L4502)

The format of the numeric monetary value is a decimal number:

value :  
units fractionalopt  
decimal-point digits

fractional :  
decimal-point digitsopt

if frac_digits() returns a positive value, or

value :  
units

otherwise[.](#3.sentence-1)

The symbol *decimal-point* indicates the character returned by decimal_point()[.](#3.sentence-2)

The other symbols are defined as follows:

units :  
digits  
digits thousands-sep units

digits :  
adigit digitsopt

In the syntax specification,
the symbol *adigit* is any of the values ct.widen(c) for c in the range '0' through '9' (inclusive) andct is a reference of type const ctype<charT>& obtained as described in the definitions
of money_get<> and money_put<>[.](#3.sentence-4)

The symbol *thousands-sep* is the character returned by thousands_sep()[.](#3.sentence-5)

The space character used is the value ct.widen(' ')[.](#3.sentence-6)

Whitespace characters are those characters c for which ci.is(space, c) returns true[.](#3.sentence-7)

The number of digits required after the decimal point (if any)
is exactly the value returned by frac_digits()[.](#3.sentence-8)

[4](#4)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L4548)

The placement of thousands-separator characters (if any)
is determined by the value returned by grouping(),
defined identically as the member numpunct<>​::​do_grouping()[.](#4.sentence-1)

[230)](#footnote-230)[230)](#footnoteref-230)

An array of char,
rather than an array of part,
is specified for pattern​::​field purely for efficiency[.](#footnote-230.sentence-1)
