Namespaces
Variants

std::money_get<CharT,InputIt>:: get, do_get

From cppreference.net
std::money_get
Member functions
money_get::get money_get::do_get
Definido en el encabezado <locale>
public :

iter_type get ( iter_type beg, iter_type end, bool intl, std:: ios_base & str,

std:: ios_base :: iostate & err, long double & units ) const ;
(1)
iter_type get ( iter_type beg, iter_type end, bool intl, std:: ios_base & str,
std:: ios_base :: iostate & err, string_type & digits ) const ;
(2)
protected :

virtual iter_type do_get ( iter_type beg, iter_type end, bool intl, std:: ios_base & str,

std:: ios_base :: iostate & err, long double & units ) const ;
(3)
virtual iter_type do_get ( iter_type beg, iter_type end, bool intl, std:: ios_base & str,
std:: ios_base :: iostate & err, string_type & digits ) const ;
(4)

Analiza el valor monetario de un iterador de entrada y escribe el resultado a un long double o string.

1,2) Funciones miembro públicas, llaman a la función miembro do_get de la clase más derivada.
3,4) Lee caracteres del iterador de entrada beg , esperando encontrar un valor monetario formateado de acuerdo con las reglas especificadas por la faceta std:: ctype imbuida en str. getloc ( ) ( ct para el resto de esta página), la faceta std:: moneypunct < CharT, intl > imbuida en str. getloc ( ) ( mp para el resto de esta página), y los indicadores de formato de flujo obtenidos de str. flags ( ) .

Si el iterador de entrada beg se vuelve igual a end antes de que se complete el análisis, establece tanto failbit como eofbit en err . Si el análisis falla por otra razón, establece el failbit en err . En cualquier caso, no modifica el parámetro de salida ( units o digits ) en caso de error.

Si el análisis tiene éxito, no cambia err , y almacena el resultado en units o digits .

El formato pattern utilizado por esta función es siempre mp. neg_format ( ) .

Si mp. grouping ( ) no permite separadores de miles, el primer separador encontrado se trata como un error de análisis; de lo contrario, se tratan como opcionales.

Si money_base::space o money_base::none es el último elemento en el pattern , el analizador no intenta consumir ningún espacio en blanco después de que se hayan analizado los otros componentes del valor monetario. De lo contrario, se consumen uno o más caracteres de espacio en blanco donde aparece money_base::space .

Si el indicador showbase está activado en str. flags ( ) , el símbolo monetario o la cadena de moneda es obligatorio; si no está activado, el símbolo monetario es opcional.

Si el primer carácter de la cadena devuelta por mp. positive_sign ( ) o mp. negative_sign ( ) se encuentra en la posición money_base::sign del patrón de formato, se consume, y se espera que el resto de caracteres en esa cadena sean consumidos después de todos los demás componentes del valor monetario. Si tanto mp. positive_sign ( ) como mp. negative_sign ( ) no están vacíos, el signo es obligatorio y debe coincidir con el primer carácter de una de estas cadenas. Si una de estas cadenas está vacía, el signo es opcional (y si está ausente, el signo del resultado corresponde a la cadena que estaba vacía). Si ambas cadenas están vacías, o tienen el mismo primer carácter, el resultado recibe el signo positivo. Si el parámetro de salida es una cadena ( digits ) y el resultado es negativo, el valor ct. widen ( '-' ) se almacena como el primer carácter del resultado.

Los dígitos de la entrada se extraen en el orden en que aparecen y se colocan en digits (después de ampliar mediante ct. widen ( ) según sea necesario), o en un búfer temporal buf1 , desde el cual el valor de units se construye como si fuera por

static const char src[] = "0123456789-";
CharT atoms[sizeof(src)];
ct.widen(src, src + sizeof(src) - 1, atoms);
for (int i = 0; i < n; ++i)
buf2[i] = src[find(atoms, atoms+sizeof(src), buf1[i]) - atoms];
buf2[n] = 0;
sscanf(buf2, "%Lf", &units);

(donde n es el número de caracteres extraídos de la entrada y almacenados en buf1 y buf2 es otro búfer de caracteres suficientemente grande).

Contenidos

Valor de retorno

Un iterador que apunta inmediatamente después del último carácter reconocido como parte válida de la cadena de entrada monetaria.

Notas

Se asume que las unidades monetarias son las unidades más pequeñas no fraccionarias de la moneda: centavos en EE.UU., yen en Japón. Por lo tanto, la secuencia de entrada "$1,056.23" en una configuración regional de EE.UU. produce el número 105623.0 en units o una cadena "105623" en digits .

Debido a que el símbolo de moneda es opcional si showbase está desactivado, pero se requiere la totalidad del multicarácter negative_sign() , dado el patrón de formato { sign, value, space, symbol } con showbase desactivado y negative_sign de "-" , la cadena "-1.23 €" se analiza como - 123 y deja "€" sin consumir en el flujo de entrada, pero si negative_sign es "()" , la cadena "(1.23 €)" se consume completamente.

El manipulador de E/S std::get_money ofrece una interfaz más simple para esta función.

Ejemplo

#include <iostream>
#include <locale>
#include <sstream>
void demo_money_get(std::locale loc, const std::string& input)
{
    std::istringstream str(input);
    str.imbue(loc);
    long double units;
    // The following can be written simpler with std::get_money(units)
    std::ios_base::iostate err = std::ios_base::goodbit;
    std::istreambuf_iterator<char> ret =
        std::use_facet<std::money_get<char>>(loc).get(
            std::istreambuf_iterator<char>(str),
            std::istreambuf_iterator<char>(),
            false, str, err, units);
    str.setstate(err);
    std::istreambuf_iterator<char> last{};
    if (str)
    {
        std::cout << "Successfully parsed '" << str.str() << "' as "
                  << units / 100 << " units\n";
        if (ret != last)
        {
            std::cout << "Remaining content: '";
            std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));
            std::cout << "'\n";
        }
        else
            std::cout << "The input was fully consumed\n";
    }
    else
    {
        std::cout << "Parse failed. Unparsed string: '";
        std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));
        std::cout << "'\n";
    }
}
int main()
{
    demo_money_get(std::locale("en_US.utf8"), "-$5.12 abc");
    demo_money_get(std::locale("ms_MY.utf8"), "(RM5.12) def");
}

Salida:

Successfully parsed '-$5.12 abc' as -5.12 units
Remaining content: ' abc'
Successfully parsed '(RM5.12) def' as -5.12 units
Remaining content: ' def'

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)
analiza un valor monetario
(plantilla de función)