25 Localization library [localization]

25.4 Standard locale categories [locale.categories]

25.4.3 The numeric punctuation facet [facet.numpunct]

25.4.3.1 Class template numpunct [locale.numpunct]

namespace std {
  template <class charT>
    class numpunct : public locale::facet {
    public:
      using char_type   = charT;
      using string_type = basic_string<charT>;

      explicit numpunct(size_t refs = 0);

      char_type    decimal_point()   const;
      char_type    thousands_sep()   const;
      string       grouping()        const;
      string_type  truename()        const;
      string_type  falsename()       const;

      static locale::id id;

    protected:
      ~numpunct();                // virtual
      virtual char_type    do_decimal_point() const;
      virtual char_type    do_thousands_sep() const;
      virtual string       do_grouping()      const;
      virtual string_type  do_truename()      const;      // for bool
      virtual string_type  do_falsename()     const;      // for bool
    };
}

numpunct<> указывает числовую пунктуацию. Специализации, требуемые в Table 69 ([locale.category]), а именно numpunct<​wchar_­t> и numpunct<char>, предоставляют классические "C" числовые форматы, т. Е. Они содержат информацию, эквивалентную той, которая содержится в "C" локали или их аналогах из широких символов, как если бы она была получена при вызове widen.

Синтаксис для числовых форматов следующий, где digit представляет собой набор оснований системы счисления, указанный fmtflags значением аргумента, а thousands-sep и decimal-point являются результатами соответствующих numpunct<charT> членов. Целочисленные значения имеют формат:

integer   ::= [sign] units
sign      ::= plusminus
plusminus ::= '+' | '-'
units     ::= digits [thousands-sep units]
digits    ::= digit [digits]

и значения с плавающей запятой имеют:

floatval ::= [sign] units [decimal-point [digits]] [e [sign] digits] |
             [sign]        decimal-point  digits   [e [sign] digits]
e        ::= 'e' | 'E'

где количество цифр между thousands-seps указано в do_­grouping(). Для синтаксического анализа, если digits часть не содержит разделителей тысяч, ограничение группировки не применяется.

25.4.3.1.1 numpunct members [facet.numpunct.members]

char_type decimal_point() const;

Returns: do_­decimal_­point().

char_type thousands_sep() const;

Returns: do_­thousands_­sep().

string grouping() const;

Returns: do_­grouping().

string_type truename() const; string_type falsename() const;

Returns: do_­truename() или do_­falsename(), соответственно.

25.4.3.1.2 numpunct virtual functions [facet.numpunct.virtuals]

char_type do_decimal_point() const;

Returns: Символ для использования в качестве разделителя десятичной системы счисления. Требуемые специализации возвращаются '.' или L'.'.

char_type do_thousands_sep() const;

Returns: Символ для использования в качестве разделителя групп цифр. Требуемые специализации возвращаются ',' или L','.

string do_grouping() const;

Returns: Basic_string <char>, vec используемый как вектор целочисленных значений, в котором каждый элемент vec[i] представляет количество цифр241 в группе в позиции i, начиная с позиции 0 как самой правой группы. Если vec.size() <= i, номер такой же, как у группы (i - 1); если (i < 0 || vec[i] <= 0 || vec[i] == CHAR_­MAX)размер группы цифр не ограничен.

Требуемые специализации возвращают пустую строку, указывающую на отсутствие группировки.

string_type do_truename() const; string_type do_falsename() const;

Returns: Строка, представляющая имя логического значения true или false, соответственно.

В реализации базового класса это имена "true" и "false", или L"true" и L"false".

Таким образом, строка "\003" определяет группы по 3 цифры каждая и, "3" вероятно, указывает группы из 51 (!) Цифры каждая, потому что 51 - это значение ASCII для "3".

25.4.3.2 Class template numpunct_­byname [locale.numpunct.byname]

namespace std {
  template <class charT>
  class numpunct_byname : public numpunct<charT> {
  // this class is specialized for char and wchar_­t.
  public:
    using char_type   = charT;
    using string_type = basic_string<charT>;

    explicit numpunct_byname(const char*, size_t refs = 0);
    explicit numpunct_byname(const string&, size_t refs = 0);
  protected:
    ~numpunct_byname();
  };
}