25 Localization library [localization]

25.4 Standard locale categories [locale.categories]

25.4.6 The monetary category [category.monetary]

25.4.6.3 Class template moneypunct [locale.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;
    };
}

moneypunct<> Фасет определяет денежные параметры форматирования , используемые money_­get<> и money_­put<>. Денежный формат представляет собой последовательность из четырех компонентов, задается pattern значением p, таким образом, что part значение static_­cast<part>(p.field[i]) определяет iй компонент формата249 В field члене pattern объекта, каждое значении symbol, sign, value, и или space или none появляется ровно один раз. Значение none, если оно присутствует, не является первым; значение space, если оно есть, не является ни первым, ни последним.

В тех местах, где none или spaceпоявляется, в формате разрешены пробелы, кроме тех, где они none появляются в конце, и в этом случае пробелы не допускаются. Значение space указывает, что в этой позиции требуется хотя бы один пробел. Если symbol появляется, последовательность символов, возвращаемая curr_­symbol() функцией, разрешена и может быть обязательной. Тамsign , где появляется, требуется первая (если есть) из последовательности символов, возвращаемых функцией positive_­sign() или negative_­sign()(соответственно, поскольку денежное значение неотрицательно или отрицательно). Любые оставшиеся символы знаковой последовательности требуются после всех остальных компонентов формата. Где value появляется, требуется абсолютное числовое значение в денежном выражении.

Формат числового денежного значения - десятичное число:

value ::= units [ decimal-point [ digits ]] |
  decimal-point digits

если frac_­digits() возвращает положительное значение, или

value ::= units

иначе. Этот символ decimal-point указывает на символ, возвращаемый функцией decimal_­point(). Остальные символы определены следующим образом:

units ::= digits [ thousands-sep units ]
digits ::= adigit [ digits ]

В описании синтаксиса, символ adigit является любым из значений ct.widen(c) для c в диапазоне '0' через '9', включительно, и ct является ссылкой типа ,const ctype<charT>& полученным , как описано в определениях money_­get<> и money_­put<>. Символ thousands-sep - это символ, возвращаемый функцией thousands_­sep(). Используемый пробел - это значение ct.widen(' '). Символы пробела - это те символы,c для которых выполняется ci.is(space, c) возврат true. Количество цифр, необходимых после десятичной точки (если есть), в точности равно значению, возвращаемому функцией frac_­digits().

Размещение символов-разделителей тысяч (если есть) определяется значением, возвращаемым grouping(), определяемым идентично члену numpunct<>​::​do_­grouping().

Массив char, а не массив part, указан pattern​::​field исключительно для эффективности.

25.4.6.3.1 moneypunct members [locale.moneypunct.members]

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;

Каждая из этих функций F возвращает результат вызова соответствующей виртуальной функции-члена do_­F().

25.4.6.3.2 moneypunct virtual functions [locale.moneypunct.virtuals]

charT do_decimal_point() const;

Returns: Разделитель системы счисления, используемый в случае, если do_­frac_­digits() он больше нуля.250

charT do_thousands_sep() const;

Returns: Разделитель групп цифр, используемый в случае, do_­grouping() указывает шаблон группировки цифр.251

string do_grouping() const;

Returns: Шаблон, идентичный, но не обязательно равному результату numpunct<charT>​::​​do_­grouping().252

string_type do_curr_symbol() const;

Returns: Строка, используемая в качестве символа идентификатора валюты.253

string_type do_positive_sign() const; string_type do_negative_sign() const;

Returns: do_­positive_­sign() возвращает строку, используемую для обозначения положительного денежного значения;254 do_­negative_­sign() возвращает строку, используемую для обозначения отрицательного значения.

int do_frac_digits() const;

Returns: Количество цифр после десятичного разделителя системы счисления, если таковой имеется.255

pattern do_pos_format() const; pattern do_neg_format() const;

Returns: В специализации требуемая в таблице 70 ([locale.category]), а именно moneypunct<char>, moneypunct<​wchar_­t>, moneypunct<char, true>, и moneypunct<wchar_­t, true>, возвращает объект типа pattern инициализируется { symbol, sign, none, value }.256

В обычных регионах США это так '.'.

В обычных регионах США это так ','.

Чтобы указать группировку по 3 с, значение равно "\003" not "3".

Для международных специализаций (второй параметр шаблона true) это обычно четыре символа, обычно три буквы и пробел.

Обычно это пустая строка.

В обычных регионах США это 2.

Обратите внимание, что международный символ, возвращаемый функцией, do_­curr_­sym() обычно сам содержит пробел; например "USD ",.