25 Localization library [localization]

25.4 Standard locale categories [locale.categories]

25.4.2 The numeric category [category.numeric]

25.4.2.2 Class template num_­put [locale.nm.put]

25.4.2.2.2 num_­put virtual functions [facet.num.put.virtuals]

iter_type do_put(iter_type out, ios_base& str, char_type fill, long val) const; iter_type do_put(iter_type out, ios_base& str, char_type fill, long long val) const; iter_type do_put(iter_type out, ios_base& str, char_type fill, unsigned long val) const; iter_type do_put(iter_type out, ios_base& str, char_type fill, unsigned long long val) const; iter_type do_put(iter_type out, ios_base& str, char_type fill, double val) const; iter_type do_put(iter_type out, ios_base& str, char_type fill, long double val) const; iter_type do_put(iter_type out, ios_base& str, char_type fill, const void* val) const;

Effects: Записывает символы в последовательность out, форматируя val по желанию. В следующем описании локальная переменная инициализируется с помощью:

locale loc = str.getloc();

Детали этой операции происходят в несколько этапов:

  • Этап 1. Определите спецификатор преобразования printf spec и определите символы, которые будут напечатаны с помощью printf ([c.files]) с учетом этого спецификатора преобразования для

    printf(spec, val)

    предполагая, что текущая локаль является "C" локалью.

  • Этап 2: Настройте представление путем преобразования каждого, char определенного на этапе 1, в a, charT используя преобразование и значения, возвращаемые членами use_­facet<numpunct<charT>>(str.getloc())

  • Этап 3: Определите, где требуется заполнение.

  • Этап 4: Вставьте последовательность в файл out.

Далее следуют подробные описания каждого этапа.

Returns: out.

  • Этап 1. Первое действие этапа 1 - определить спецификатор преобразования. В таблицах, описывающих это определение, используются следующие локальные переменные

    fmtflags flags = str.flags();
    fmtflags basefield =  (flags & (ios_base::basefield));
    fmtflags uppercase =  (flags & (ios_base::uppercase));
    fmtflags floatfield = (flags & (ios_base::floatfield));
    fmtflags showpos =    (flags & (ios_base::showpos));
    fmtflags showbase =   (flags & (ios_base::showbase));
    fmtflags showpoint =  (flags & (ios_base::showpoint));

    Все таблицы, используемые при описании этапа 1, заказаны. То есть применяется первая строка, для которой выполнено условие. Строка без условия является поведением по умолчанию, когда ни одна из предыдущих строк не применяется.

    Для преобразования из целочисленного типа, отличного от символьного, функция определяет спецификатор целочисленного преобразования, как указано в таблице 75.

    Таблица 75 - Целочисленные преобразования
    Состояние stdio эквивалент
    basefield == ios_­base​::​oct %o
    (basefield == ios_­base​::​hex) && !uppercase %x
    (basefield == ios_­base​::​hex) %X
    для signed целого типа %d
    для unsigned целого типа %u

    Для преобразования из типа с плавающей запятой функция определяет спецификатор преобразования с плавающей запятой, как указано в таблице 76.

    Таблица 76 - Преобразования с плавающей запятой
    Состояние stdio эквивалент
    floatfield == ios_­base​::​fixed %f
    floatfield == ios_­base​::​scientific && !uppercase %e
    floatfield == ios_­base​::​scientific %E
    floatfield == (ios_­base​::​fixed | ios_­base​::​scientific) && !uppercase %a
    floatfield == (ios_­base​::​fixed | ios_­base​::​scientific) %A
    !uppercase %g
    otherwise %G

    Для преобразований из целочисленного типа или типа с плавающей запятой к спецификатору преобразования добавляется модификатор длины, как указано в таблице 77.

    Таблица 77 - модификатор длины
    Тип Модификатор длины
    long l
    long long ll
    unsigned long l
    unsigned long long ll
    long double L
    otherwise none

    К спецификатору преобразования добавлены следующие необязательные дополнительные квалификаторы, как указано в таблице 78.

    Таблица 78 - Числовые преобразования
    Тип (ы)Состояние stdio эквивалент
    интегральный тип showpos +
    showbase #
    тип с плавающей запятой showpos +
    showpoint #

    Для преобразования из типа с плавающей точкой, если floatfield != (ios_­base​::​fixed | ios_­base​::​​scientific), str.precision() определяются как точность в спецификации преобразования. В противном случае точность не указана.

    Для преобразования из void* спецификатора есть %p.

    Представления в конце этапа 1 состоят из char's, которые будут напечатаны вызовом printf(s, val) where s - спецификатор преобразования, определенный выше.

  • Этап 2: Любой символ, c кроме десятичной точки (.), Преобразуется в переходное charT отверстие. use_­facet<ctype<charT>>(loc).widen( c )

    Локальная переменная punct инициализируется через

    const numpunct<charT>& punct = use_facet<numpunct<charT>>(str.getloc());

    Для арифметических типов punct.thousands_­sep() символы вставляются в последовательность, как определено значением, возвращаемым с punct.do_­grouping() помощью метода, описанного в [facet.numpunct.virtuals]

    Символы десятичной точки (.) Заменяются на punct.decimal_­point()

  • Этап 3: локальная переменная инициализируется как

    fmtflags adjustfield = (flags & (ios_base::adjustfield));

    Расположение любой прокладки240 определяется по Табл 79.

    Таблица 79 - заполнение заполнения
    СостояниеМесто нахождения
    adjustfield == ios_­base​::​left подушечка после
    adjustfield == ios_­base​::​right колодка перед
    adjustfield == internal и знак встречается в представлении блокнот после знака
    adjustfield == internal и представление после этапа 1 началось с 0x или 0X проложить после x или X
    otherwise колодка перед

    Если не str.width() равно нулю и количество символовcharTв последовательности после этапа 2 меньше чем str.​width(), то fill в последовательность добавляется достаточное количество символов в позиции, указанной для заполнения, чтобы довести длину последовательности до str.width().

    str.width(0) называется.

  • Этап 4: последовательность charTсимволов в конце этапа 3 выводится через

    *out++ = c

iter_type do_put(iter_type out, ios_base& str, char_type fill, bool val) const;

Returns: Если (str.flags() & ios_­base​::​boolalpha) == 0 возвращается do_­put(out, str, fill,
(int)val)
, иначе получает строку, s как если бы

string_type s =
  val ? use_facet<numpunct<charT>>(loc).truename()
      : use_facet<numpunct<charT>>(loc).falsename();

а затем вставляет каждый символ c в s переходное out отверстие *out++ = c и возвращает out.

Спецификация преобразования #o генерирует интерлиньяж, 0 который является not символом заполнения.