num_get (Clase)
Una plantilla de clase que describe un objeto que puede actuar como una faceta de la configuración regional para controlar las conversiones de las secuencias de tipo CharType
en valores numéricos.
Sintaxis
template <class CharType, class InputIterator = istreambuf_iterator<CharType>>
class num_get : public locale::facet;
Parámetros
CharType
Tipo usado dentro de un programa para codificar los caracteres de una configuración regional.
InputIterator
El tipo de iterador del que las funciones get numéricas leen su entrada.
Comentarios
Como ocurre con cualquier faceta de configuración regional, el identificador de objeto estático tiene un valor almacenado inicial de cero. El primer intento de acceso a su valor almacenado almacena un valor positivo único en id.
Constructores
Constructor | Descripción |
---|---|
num_get | Constructor para los objetos de tipo num_get que se usan para extraer valores numéricos de secuencias. |
Typedefs
Nombre de tipo | Descripción |
---|---|
char_type | Tipo que se usa para describir un carácter empleado por una configuración regional. |
iter_type | Tipo que describe un iterador de entrada. |
Funciones miembro
Función de miembro | Descripción |
---|---|
do_get | Función virtual a la que se llama para extraer un valor numérico o un valor booleano de una secuencia de caracteres. |
get | Extrae un valor numérico o un valor booleano de una secuencia de caracteres. |
Requisitos
Encabezado:<locale>
Espacio de nombres: std
num_get::char_type
Tipo que se usa para describir un carácter empleado por una configuración regional.
typedef CharType char_type;
Comentarios
El tipo es un sinónimo del parámetro de plantilla CharType.
num_get::d o_get
Función virtual a la que se llama para extraer un valor numérico o un valor booleano de una secuencia de caracteres.
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
long& val) const;
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
unsigned short& val) const;
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
unsigned int& val) const;
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
unsigned long& val) const;
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
long long& val) const;
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
unsigned long long& val) const;
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
float& val) const;
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
double& val) const;
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
long double& val) const;
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
void *& val) const;
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
bool& val) const;
Parámetros
first
El principio del intervalo de caracteres del que se va a leer el número.
last
El final del intervalo de caracteres del que se va a leer el número.
iosbase
El objeto ios_base cuyas marcas se usan por la conversión.
state
El estado al que failbit (ver ios_base::iostate) se agrega en caso de error.
val
Valor que se leyó.
Valor devuelto
El iterador después de que el valor se haya leído.
Comentarios
La primera función miembro virtual protegida,
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
long& val) const;
hace coincidir elementos secuenciales que comienzan por first en la secuencia [first, last)
hasta que reconoce un campo de entrada numérico entero completo y que no esté vacío. Si se realiza correctamente, convierte este campo en su valor equivalente como tipo long
y almacena el resultado en val. Devuelve un iterador que designa el primer elemento más allá del campo de entrada numérico. De otro modo, la función no almacena nada en val y establece ios_base::failbit
en state
. Devuelve un iterador que designa el primer elemento más allá de cualquier prefijo de un campo de entrada numérico entero válido. En cualquier caso, si el valor devuelto es igual a last
, la función establece ios_base::eofbit
en state
.
El campo de entrada numérico entero se convierte mediante las mismas reglas que han usado las funciones de análisis para hacer coincidir y convertir una serie de elementos char
de un archivo. (Se presupone que cada uno de estos elementos char
se asigna a un elemento equivalente de tipo Elem
mediante una asignación simple, uno a uno). La especificación de conversión de análisis equivalente se determina de la manera siguiente:
Si iosbase.
ios_base::flags() & ios_base::basefield == ios_base::
oct, la especificación de conversión es lo
.
Si iosbase.flags() & ios_base::basefield == ios_base::
hex, la especificación de conversión es lx
.
Si iosbase.flags() & ios_base::basefield == 0
, la especificación de conversión es li
.
De otro modo, la especificación de conversión es ld
.
El formato de un campo de entrada entero viene determinado por la facetafac
de configuración regional devuelta por la llamada use_facet<
numpunct<Elem>(iosbase.
ios_base::getloc.())
Específicamente:
fac.
numpunct::grouping()
determina cómo se agrupan los dígitos a la izquierda de cualquier separador decimal.
fac.
numpunct::thousands_sep()
determina la secuencia que separa grupos de dígitos a la izquierda de cualquier separador decimal.
Si no se produce ninguna instancia de fac.thousands_sep()
en el campo de entrada numérico, no se impone ninguna restricción de agrupación. De otro modo, se aplica cualquier restricción de agrupación impuesta por fac.grouping()
y los separadores se quitan antes de que se produzca la conversión de análisis.
La cuarta función miembro virtual protegida:
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
unsigned long& val) const;
se comporta igual que la primera, excepto que reemplaza una especificación de conversión de ld
por lu
. Si se realiza correctamente, convierte el campo de entrada numérico en un valor de tipo unsigned long
y almacena ese valor en val.
La quinta función miembro virtual protegida:
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
long long& val) const;
se comporta igual que la primera, excepto que reemplaza una especificación de conversión de ld
por lld
. Si se realiza correctamente, convierte el campo de entrada numérico en un valor de tipo long long
y almacena ese valor en val.
La sexta función miembro virtual protegida:
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
unsigned long long& val) const;
se comporta igual que la primera, excepto que reemplaza una especificación de conversión de ld
por llu
. Si se realiza correctamente, convierte el campo de entrada numérico en un valor de tipo unsigned long long
y almacena ese valor en val.
La séptima función miembro virtual protegida:
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
float& val) const;
se comporta igual que la primera, excepto que intenta coincidir con un campo de entrada de punto flotante completo y que no esté vacío. fac.
numpunct::decimal_point()
determina la secuencia que separa los dígitos enteros de los dígitos de fracción. El especificador de conversión de análisis equivalente es lf
.
La octava función miembro virtual protegida:
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
double& val) const;
se comporta igual que la primera, excepto que intenta coincidir con un campo de entrada de punto flotante completo y que no esté vacío. fac.
numpunct::decimal_point()
determina la secuencia que separa los dígitos enteros de los dígitos de fracción. El especificador de conversión de análisis equivalente es lf
.
La novena función miembro virtual protegida:
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
long double& val) const;
se comporta igual que la octava, excepto que el especificador de conversión de análisis equivalente es Lf
.
La décima función miembro virtual protegida:
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
void *& val) const;
se comporta igual que la primera, excepto que el especificador de conversión de análisis equivalente es p
.
La última (undécima) función miembro virtual protegida:
virtual iter_type do_get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
bool& val) const;
se comporta igual que la primera, excepto que intenta coincidir con un campo de entrada booleano completo y que no esté vacío. Si se realiza correctamente, convierte el campo de entrada booleano en un valor de tipo bool
y almacena ese valor en val.
Un campo de entrada booleano adopta una de dos formas. Si iosbase.flags() & ios_base::
boolalpha es False, es igual que un campo de entrada numérico entero, excepto que el valor convertido debe ser 0 (para False) o 1 (para True). De otro modo, la secuencia debe coincidir con fac.
numpunct::falsename()
(para False), o con fac.
numpunct::truename()
(para True).
Ejemplo
Vea el ejemplo de get, donde do_get
llama a la función miembro virtual.
num_get::get
Extrae un valor numérico o un valor booleano de una secuencia de caracteres.
iter_type get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
bool& val) const;
iter_type get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
unsigned short& val) const;
iter_type get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
unsigned int& val) const;
iter_type get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
long& val) const;
iter_type get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
unsigned long& val) const;
iter_type get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
long long& val) const;
iter_type get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
unsigned long long& val) const;
iter_type get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
float& val) const;
iter_type get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
double& val) const;
iter_type get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
long double& val) const;
iter_type get(
iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
void *& val) const;
Parámetros
first
El principio del intervalo de caracteres del que se va a leer el número.
last
El final del intervalo de caracteres del que se va a leer el número.
iosbase
El objeto ios_base cuyas marcas se usan por la conversión.
state
El estado al que failbit (ver ios_base::iostate) se agrega en caso de error.
val
Valor que se leyó.
Valor devuelto
El iterador después de que el valor se haya leído.
Comentarios
Todas las funciones miembro devuelven do_get( first, last, iosbase, state, val)
.
La primera función miembro virtual protegida intenta comparar los elementos secuenciales, empezando al principio de la secuencia [ first
, last
) hasta que reconoce un campo de entrada numérico entero completo y que no esté vacío. Si se realiza correctamente, convierte este campo en su valor equivalente como tipo long
y almacena el resultado en val. Devuelve un iterador que designa el primer elemento más allá del campo de entrada numérico. De otro modo, la función no almacena nada en val y establece ios_base::failbit
en state. Devuelve un iterador que designa el primer elemento más allá de cualquier prefijo de un campo de entrada numérico entero válido. En cualquier caso, si el valor devuelto es igual a last, la función establece ios_base::eofbit
en state.
El campo de entrada numérico entero se convierte mediante las mismas reglas que han usado las funciones de análisis para hacer coincidir y convertir una serie de elementos char
de un archivo. Se supone que cada uno de estos elementos char
se asigna a un elemento equivalente de tipo CharType
mediante una asignación simple, uno a uno. La especificación de conversión de análisis equivalente se determina de la manera siguiente:
Si
iosbase.
flags& ios_base::basefield == ios_base::
oct, la especificación de conversión eslo
.Si
iosbase.flags & ios_base::basefield == ios_base::
hex, la especificación de conversión eslx
.Si
iosbase.flags & ios_base::basefield == 0
, la especificación de conversión esli
.De otro modo, la especificación de conversión es
ld
.
El formato de un campo de entrada entero viene determinado por la faceta fac
de configuración regional devuelta por la llamada use_facet<
numpunct
<Elem>(iosbase.
getloc.())
Específicamente:
fac.
grouping determina cómo se agrupan los dígitos a la izquierda de cualquier separador decimal.fac.
thousands_sep determina la secuencia que separa grupos de dígitos a la izquierda de cualquier separador decimal.
Si no se produce ninguna instancia de fac.thousands_sep
en el campo de entrada numérico, no se impone ninguna restricción de agrupación. De otro modo, se aplica cualquier restricción de agrupación impuesta por fac.grouping
y los separadores se quitan antes de que se produzca la conversión de análisis.
La segunda función miembro virtual protegida:
virtual iter_type do_get(iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
unsigned long& val) const;
se comporta igual que la primera, excepto que reemplaza una especificación de conversión de ld
por lu
. Si se realiza correctamente, convierte el campo de entrada numérico en un valor de tipo unsigned long
y almacena ese valor en val.
La tercera función miembro virtual protegida:
virtual iter_type do_get(iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
double& val) const;
se comporta igual que la primera, excepto que intenta coincidir con un campo de entrada de punto flotante completo y que no esté vacío. fac.
decimal_point determina la secuencia que separa los dígitos enteros de los dígitos de fracción. El especificador de conversión de análisis equivalente es lf
.
La cuarta función miembro virtual protegida:
virtual iter_type do_get(iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
long double& val) const;
se comporta igual que la tercera, excepto que el especificador de conversión de análisis equivalente es Lf
.
La quinta función miembro virtual protegida:
virtual iter_type do_get(iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
void *& val) const;
se comporta igual que la primera, excepto que el especificador de conversión de análisis equivalente es p
.
La sexta función miembro virtual protegida:
virtual iter_type do_get(iter_type first,
iter_type last,
ios_base& iosbase,
ios_base::iostate& state,
bool& val) const;
se comporta igual que la primera, excepto que intenta coincidir con un campo de entrada booleano completo y que no esté vacío. Si se realiza correctamente, convierte el campo de entrada booleano en un valor de tipo bool
y almacena ese valor en val.
Un campo de entrada booleano adopta una de dos formas. Si iosbase.flags & ios_base::
boolalpha es false
, es igual que un campo de entrada numérico entero, excepto en que el valor convertido debe ser 0 (para false
) o 1 (para true
). De otro modo, la secuencia debe coincidir con fac.
falsename (para false
) o con fac.
truename (para true
).
Ejemplo
// num_get_get.cpp
// compile with: /EHsc
#include <locale>
#include <iostream>
#include <sstream>
using namespace std;
int main( )
{
locale loc( "german_germany" );
basic_stringstream<char> psz, psz2;
psz << "-1000,56";
ios_base::iostate st = 0;
long double fVal;
cout << use_facet <numpunct <char> >(loc).thousands_sep( ) << endl;
psz.imbue( loc );
use_facet <num_get <char> >
(loc).get( basic_istream<char>::_Iter( psz.rdbuf( ) ),
basic_istream<char>::_Iter(0), psz, st, fVal );
if ( st & ios_base::failbit )
cout << "money_get( ) FAILED" << endl;
else
cout << "money_get( ) = " << fVal << endl;
}
num_get::iter_type
Tipo que describe un iterador de entrada.
typedef InputIterator iter_type;
Comentarios
El tipo es un sinónimo del parámetro de plantilla InputIterator
.
num_get::num_get
Constructor para los objetos de tipo num_get
que se usan para extraer valores numéricos de secuencias.
explicit num_get(size_t refs = 0);
Parámetros
refs
Valor entero que se usa para especificar el tipo de administración de memoria del objeto.
Comentarios
Los valores posibles del parámetro refs y su importancia son:
0: la vigencia del objeto se administra mediante las configuraciones regionales que lo contienen.
1: la vigencia del objeto se debe administrar de manera manual.
> 1: estos valores no están definidos.
No es posible mostrar ejemplos directos, porque el destructor está protegido.
El constructor inicializa su objeto base con locale::
facet(refs)
.
Consulte también
<locale>
facet (Clase)
Seguridad para subprocesos en la biblioteca estándar de C++