Namespaces
Variants

std::money_put<CharT,OutputIt>:: put, do_put

From cppreference.net
std::money_put
Member functions
money_put::put money_put::do_put
Definido en el encabezado <locale>
public :

iter_type put ( iter_type out, bool intl, std:: ios_base & f,

char_type fill, long double quant ) const ;
(1)
iter_type put ( iter_type out, bool intl, std:: ios_base & f,
char_type fill, const string_type & quant ) const ;
(2)
protected :

virtual iter_type do_put ( iter_type out, bool intl, std:: ios_base & str,

char_type fill, long double units ) const ;
(3)
virtual iter_type do_put ( iter_type out, bool intl, std:: ios_base & str,
char_type fill, const string_type & digits ) const ;
(4)

Formatea el valor monetario y escribe el resultado en el flujo de salida.

1,2) Funciones miembro públicas, llaman a la función miembro do_put de la clase más derivada.
3) Los argumentos numéricos units se convierten a una cadena de caracteres anchos como si fuera mediante ct. widen ( buf1, buf1 + std:: sprintf ( buf1, "%.0Lf" , units ) , buf2 ) , donde ct es la faceta std::ctype imbuida en str. getloc ( ) y buf1 y buf2 son búferes de caracteres suficientemente grandes. La cadena de caracteres resultante buf2 se procesa, formatea y envía a out como se describe a continuación.
4) Del argumento de cadena digits , solo el signo menos opcional inicial (determinado mediante comparación con ct. widen ( '-' ) , donde ct es la faceta std::ctype imbuida en str. getloc ( ) ) y los caracteres de dígito inmediatamente siguientes (clasificados por ct ) se toman como la secuencia de caracteres a procesar, formatear y enviar a out como se describe a continuación.

Dada la secuencia de caracteres de los pasos anteriores, si el primer carácter es igual a ct. widen ( '-' ) , llama a mp. neg_format ( ) para obtener el patrón de formato; de lo contrario, llama a mp. pos_format ( ) , donde mp es el facet std:: moneypunct < CharT, intl > imbricado en str. getloc ( ) .

Los caracteres separador de miles y punto decimal se insertan según lo requerido por mp. grouping ( ) , mp. frac_digits ( ) , mp. decimal_point ( ) , y mp. thousands_sep ( ) , y la cadena resultante se coloca en la secuencia de salida donde value aparece en el patrón de formato.

Si str. flags ( ) & str. showbase es distinto de cero (se utilizó el manipulador std::showbase ), entonces el símbolo o cadena monetaria se genera llamando a mp. curr_symbol ( ) y se coloca en la secuencia de salida donde aparece symbol en el patrón de formato.

Si mp. positive_sign ( ) (en caso de que se utilice el patrón de formato positivo) o mp. negative_sign ( ) (en caso de que se utilice el patrón de formato negativo) devuelve una cadena con más de un carácter, el primer carácter devuelto se coloca en la secuencia de salida donde sign aparece en el patrón de formato, y el resto de los caracteres se colocan después de todos los demás caracteres. Por ejemplo, el patrón de formato { sign, value, space, symbol } con unidades 123 y negative_sign de "-" podría resultar en "-1.23 €" , mientras que negative_sign de "()" generaría "(1.23 €)" .

Si el número de caracteres generados para el formato especificado es menor que el valor devuelto por str. width ( ) , entonces se insertan copias de fill para llevar la longitud total de la secuencia de salida exactamente a str. width ( ) , de la siguiente manera:

  • Si str. flags ( ) & str. adjustfield es igual a str. internal , los caracteres de relleno se insertan donde aparezca none o space en el patrón de formato.
  • De lo contrario, si str. flags ( ) & str. adjustfield es igual a str. left , las copias de fill se añaden después de todos los demás caracteres.
  • De lo contrario, los caracteres de relleno se colocan antes de todos los demás caracteres.

Al final, llama str. width ( 0 ) para cancelar los efectos de cualquier std::setw .

Contenidos

Valor de retorno

Un iterador que apunta inmediatamente después del último carácter producido.

Notas

Se asume que las unidades monetarias son las unidades no fraccionarias más pequeñas de la moneda: centavos en Estados Unidos, yenes en Japón.

Ejemplo

#include <iomanip>
#include <iostream>
#include <locale>
struct my_punct : std::moneypunct_byname<char, false>
{
    my_punct(const char* name) : moneypunct_byname(name) {}
    string_type do_negative_sign() const { return "()"; }
};
int main()
{
    std::locale loc("ru_RU.utf8");
    std::cout.imbue(loc);
    long double units = -123.45;
    std::cout << "In Russian locale, " << units << " prints as " << std::showbase;
    // note, the following is equivalent to simply std::put_money(units)
    std::use_facet<std::money_put<char>>(loc).put(
        {std::cout}, false, std::cout, std::cout.fill(), units);
    std::cout << '\n';
    std::cout.imbue(std::locale(std::cout.getloc(), new my_punct("ru_RU.utf8")));
    std::cout << "With negative_sign set to \"()\", it prints as ";
    std::use_facet<std::money_put<char>>(loc).put(
        {std::cout}, false, std::cout, std::cout.fill(), units);
    std::cout << '\n';
}

Salida:

In Russian locale, -123,45 prints as -1.23 руб
With negative_sign set to "()", it prints as (1.23 руб)

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 328 C++98 la cadena de formato utilizada para std::sprintf era "%.01f" corregido a "%.0Lf"

Véase también

define los parámetros de formato monetario utilizados por std::money_get y std::money_put
(plantilla de clase)
analiza y construye un valor monetario a partir de una secuencia de caracteres de entrada
(plantilla de clase)
(C++11)
formatea y emite un valor monetario
(plantilla de función)