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 часть не содержит разделителей тысяч, ограничение группировки не применяется.
char_type decimal_point() const;
char_type thousands_sep() const;
string grouping() const;
string_type truename() const;
string_type falsename() const;
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;
Таким образом, строка "\003" определяет группы по 3 цифры каждая и, "3" вероятно, указывает группы из 51 (!) Цифры каждая, потому что 51 - это значение ASCII для "3".
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();
};
}