std::money_get<CharT,InputIt>:: get, do_get
|
Definido en el encabezado
<locale>
|
||
|
public
:
iter_type get
(
iter_type beg, iter_type end,
bool
intl,
std::
ios_base
&
str,
|
(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,
|
(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.
do_get
de la clase más derivada.
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) |