Compartir por


locale (Clase)

La clase que describe un objeto de configuración regional que encapsula la información específica de la configuración regional como un conjunto de facetas que definen colectivamente un entorno traducido y adaptado concreto.

Sintaxis

class locale;

Comentarios

Una faceta es un puntero a un objeto de una clase derivada de la clase facet que tiene un objeto público con el formato:

static locale::id id;

Puede definir un conjunto abierto de estas facetas. También puede crear un objeto de configuración regional que designe un número arbitrario de facetas.

Los grupos predefinidos de estas facetas representan las categorías de configuración regional administradas tradicionalmente en la biblioteca estándar de C por la función setlocale.

La categoría collate (LC_COLLATE) incluye las facetas:

collate<char>
collate<wchar_t>

La categoría ctype (LC_CTYPE) incluye las facetas:

ctype<char>
ctype<wchar_t>
codecvt<char, char, mbstate_t>
codecvt<wchar_t, char, mbstate_t>
codecvt<char16_t, char, mbstate_t>
codecvt<char32_t, char, mbstate_t>

La categoría monetary (LC_MONETARY) incluye las facetas:

moneypunct<char, false>
moneypunct<wchar_t, false>
moneypunct<char, true>
moneypunct<wchar_t, true>
money_get<char, istreambuf_iterator<char>>
money_get<wchar_t, istreambuf_iterator<wchar_t>>
money_put<char, ostreambuf_iterator<char>>
money_put<wchar_t, ostreambuf_iterator<wchar_t>>

La categoría numeric (LC_NUMERIC) incluye las facetas:

num_get<char, istreambuf_iterator<char>>
num_get<wchar_t, istreambuf_iterator<wchar_t>>
num_put<char, ostreambuf_iterator<char>>
num_put<wchar_t, ostreambuf_iterator<wchar_t>>
numpunct<char>
numpunct<wchar_t>

La categoría time (LC_TIME) incluye las facetas:

time_get<char, istreambuf_iterator<char>>
time_get<wchar_t, istreambuf_iterator<wchar_t>>
time_put<char, ostreambuf_iterator<char>>
time_put<wchar_t, ostreambuf_iterator<wchar_t>>

La categoría messages (LC_MESSAGES) incluye las facetas:

messages<char>
messages<wchar_t>

(La última categoría es necesaria para POSIX, pero no para el estándar de C).

Las clases iostream usan algunas de estas facetas predefinidas para controlar la conversión de valores numéricos a y desde secuencias de texto.

Un objeto de clase locale clase también almacena un nombre de configuración regional como un objeto de la clase string. El uso de un nombre no válido de configuración regional para construir una faceta o un objeto de configuración regional produce un objeto de la clase runtime_error. El nombre almacenado de la configuración regional es "*" si el objeto de configuración regional no puede estar seguro de que una configuración regional de estilo C corresponde exactamente a la representada por el objeto. De lo contrario, puede establecer una configuración regional coincidente dentro de la biblioteca estándar de C para algún objeto de configuración regional locale_object mediante una llamada a setlocale(LC_ALL , locale_object.name().c_str()).

En esta implementación, también puede llamar a la función miembro estática:

static locale empty();

para construir un objeto de configuración regional que no tiene ninguna faceta. También es una configuración regional transparente. Si las funciones de plantilla has_facet y use_facet no encuentran la faceta solicitada en una configuración regional transparente, consultan primero la configuración regional global y después, si es transparente, la configuración regional clásica. De este modo, puede escribir:

cout.imbue(locale::empty());

Las inserciones posteriores a cout se realizan según el estado actual de la configuración regional global. Incluso puede escribir:

locale loc(locale::empty(),
    locale::classic(),
    locale::numeric);

cout.imbue(loc);

Las reglas de formato numérico para las inserciones posteriores a cout son las mismas que en la configuración regional de C, incluso aunque la configuración regional global proporcione reglas que cambian para insertar fechas y cantidades monetarias.

Constructores

Constructor Descripción
locale Crea una configuración regional, una copia de una configuración regional o una copia de la configuración regional donde una faceta o una categoría se ha reemplazado por una faceta o una categoría de otra configuración regional.

Typedefs

Nombre de tipo Descripción
category Tipo entero que proporciona valores de máscara de bits para denotar familias de facetas estándar.

Funciones miembro

Función de miembro Descripción
combine Inserta una faceta de una configuración regional especificada en una configuración regional de destino.
name Devuelve el nombre de configuración regional almacenado.

Funciones estáticas

Nombre Descripción
clásico La función miembro static devuelve un objeto de configuración regional que representa la configuración regional clásica de C.
global Restablece la configuración regional predeterminada del programa.

Operadores

Operador Descripción
operator= Asigna una configuración regional.
operator!= Comprueba si dos configuraciones regionales son distintas.
operator( ) Compara dos objetos basic_string.
operator== Comprueba si dos configuraciones regionales son iguales.

Clases

Clase Descripción
facet Clase que actúa como clase base para todas las facetas de configuración regional.
id La clase miembro proporciona un identificador único de faceta que se usa como índice para buscar facetas en una configuración regional.

Requisitos

Encabezado:<locale>

Espacio de nombres: std

locale::category

Tipo entero que proporciona valores de máscara de bits para denotar familias de facetas estándar.

typedef int category;
static const int collate = LC_COLLATE;
static const int ctype = LC_CTYPE;
static const int monetary = LC_MONETARY;
static const int numeric = LC_NUMERIC;
static const int time = LC_TIME;
static const int messages = LC_MESSAGES;
static const int all = LC_ALL;
static const int none = 0;

Comentarios

El tipo es sinónimo de un tipo int que puede representar un grupo de elementos distintos de una configuración regional de tipo de máscara de bits en una configuración regional de clase o puede usarse para representar cualquiera de las categorías de configuración regional de C correspondientes. Los elementos son:

  • collate, que se corresponde con la categoría LC_COLLATE de C

  • ctype, que se corresponde con la categoría LC_CTYPE de C

  • monetary, que se corresponde con la categoría LC_MONETARY de C

  • numeric, que se corresponde con la categoría LC_NUMERIC de C

  • time, que se corresponde con la categoría LC_TIME de C

  • messages, que se corresponde con la categoría LC_MESSAGES de POSIX

Dos valores más útiles son:

  • none, que no se corresponde con ninguna de las categorías de C

  • all, que se corresponde con la unión de C de todas las categorías LC_ALL

Puede representar un grupo arbitrario de categorías mediante un OR de bit a bit con estas constantes, como en monetary | time.

locale::classic

La función miembro static devuelve un objeto de configuración regional que representa la configuración regional clásica de C.

static const locale& classic();

Valor devuelto

Referencia a la configuración regional de C.

Comentarios

La configuración regional clásica de C es la configuración regional ASCII en inglés de EE. UU. dentro de la biblioteca estándar de C. Es la configuración regional que se usa implícitamente en programas que no están internacionalizados.

Ejemplo

// locale_classic.cpp
// compile with: /EHsc
#include <iostream>
#include <string>
#include <locale>

using namespace std;

int main( )
{
   locale loc1( "german" );
   locale loc2 = locale::global( loc1 );
   cout << "The name of the previous locale is: " << loc2.name( )
        << "." << endl;
   cout << "The name of the current locale is: " << loc1.name( )
        << "." << endl;

   if (loc2 == locale::classic( ) )
      cout << "The previous locale was classic." << endl;
   else
      cout << "The previous locale was not classic." << endl;

   if (loc1 == locale::classic( ) )
      cout << "The current locale is classic." << endl;
   else
      cout << "The current locale is not classic." << endl;
}
The name of the previous locale is: C.
The name of the current locale is: German_Germany.1252.
The previous locale was classic.
The current locale is not classic.

locale::combine

Inserta una faceta de una configuración regional especificada en una configuración regional de destino.

template <class Facet>
locale combine(const locale& source_locale) const;

Parámetros

source_locale
Configuración regional que contiene la faceta que se va a insertar en la configuración regional de destino.

Valor devuelto

La función miembro devuelve un objeto de configuración regional que reemplaza o agrega a *this la faceta Facet indicada en source_locale.

Ejemplo

// locale_combine.cpp
// compile with: /EHsc
#include <locale>
#include <iostream>
#include <tchar.h>
using namespace std;

int main() {
   locale loc ( "German_germany" );
   _TCHAR * s1 = _T("Das ist wei\x00dfzz."); // \x00df is the German sharp-s; it comes before z in the German alphabet
   _TCHAR * s2 = _T("Das ist weizzz.");
   int result1 = use_facet<collate<_TCHAR> > ( loc ).
      compare (s1, &s1[_tcslen( s1 )-1 ],  s2, &s2[_tcslen( s2 )-1 ] );
   cout << isalpha (_T ( '\x00df' ), loc ) << result1 << endl;

   locale loc2 ( "C" );
   int result2 = use_facet<collate<_TCHAR> > ( loc2 ).
      compare (s1, &s1[_tcslen( s1 )-1 ],  s2, &s2[_tcslen( s2 )-1 ] );
   cout << isalpha (_T ( '\x00df' ), loc2 )  << result2 << endl;

   locale loc3 = loc2.combine<collate<_TCHAR> > (loc);
   int result3 = use_facet<collate<_TCHAR> > ( loc3 ).
      compare (s1, &s1[_tcslen( s1 )-1 ],  s2, &s2[_tcslen( s2 )-1 ] );
   cout << isalpha (_T ( '\x00df' ), loc3 ) << result3 << endl;
}

facet (Clase)

Clase que actúa como clase base para todas las facetas de configuración regional.

class facet {
protected:
    explicit facet(size_t references = 0);
    virtual ~facet();
private:
    facet(const facet&) // not defined
    void operator=(const facet&) // not defined
};

Comentarios

No se puede copiar ni asignar un objeto de clase facet. Puede crear y destruir objetos derivados de la clase locale::facet, pero no los objetos de la clase base correcta. Normalmente, se construye un objeto _Myfac derivado de facet al construir una locale, como en locale loc(locale::classic(), new _Myfac);.

En tales casos, el constructor de la clase base facet debe tener un argumento de cero referencias. Cuando el objeto ya no es necesario, se elimina. Proporcione un argumento referencias distinto de cero solo en los pocos casos en los que se haga responsable de la duración del objeto.

locale::global

Restablece la configuración regional predeterminada del programa. Esta llamada afecta a la configuración regional global de C y C++.

static locale global(const locale& new_default_locale);

Parámetros

new_default_locale
Configuración regional que el programa usará como configuración regional predeterminada.

Valor devuelto

Configuración regional anterior al restablecimiento de la configuración regional predeterminada.

Comentarios

Al inicio del programa, la configuración regional global es igual que la configuración regional clásica. La función global() llama a setlocale( LC_ALL, loc.name. c_str()) para establecer una configuración regional coincidente en la biblioteca estándar de C++.

Ejemplo

// locale_global.cpp
// compile by using: /EHsc
#include <locale>
#include <iostream>
#include <tchar.h>
using namespace std;

int main( )
{
   locale loc ( "German_germany" );
   locale loc1;
   cout << "The initial locale is: " << loc1.name( ) << endl;
   locale loc2 = locale::global ( loc );
   locale loc3;
   cout << "The current locale is: " << loc3.name( ) << endl;
   cout << "The previous locale was: " << loc2.name( ) << endl;
}
The initial locale is: C
The current locale is: German_Germany.1252
The previous locale was: C

id (clase)

La clase miembro proporciona un identificador único de faceta que se usa como índice para buscar facetas en una configuración regional.

class id
{
   protected:    id();
   private:      id(const id&)
   void operator=(const id&)  // not defined
};

Comentarios

La clase de miembro describe el objeto de miembro estático requerido por cada faceta de configuración regional única. No se puede copiar ni asignar un objeto de clase id.

locale::locale

Crea una configuración regional, una copia de una configuración regional o una copia de la configuración regional donde una faceta o una categoría se ha reemplazado por una faceta o una categoría de otra configuración regional. También incluye un destructor.

locale();

explicit locale(const char* locale_name, category new_category = all);
explicit locale(const string& locale_name);
locale(const locale& from_locale);
locale(const locale& from_locale, const locale& Other, category new_category);
locale(const locale& from_locale, const char* locale_name, category new_category);

template <class Facet>
locale(const locale& from_locale, const Facet* new_facet);

~locale();

Parámetros

locale_name
Nombre de una configuración regional.

from_locale
Configuración regional que se va a copiar en la construcción de la nueva configuración regional.

Otros
Configuración regional de la que se va a seleccionar una categoría.

new_category
Categoría que se va a sustituir en la configuración regional construida.

new_facet
Faceta que se va a sustituir en la configuración regional construida.

Comentarios

El primer constructor inicializa el objeto para que coincida con la configuración regional global. El segundo y el tercer constructor inicializan todas las categorías de configuración regional para que tengan un comportamiento coherente con el nombre de la configuración regional locale_name. Los demás constructores copian from_locale, con las excepciones que se indican a continuación:

locale(const locale& from_locale, const locale& Other, category new_category);

reemplaza de Otras facetas correspondientes a una categoría C para la que C & new_category es distinto de cero.

locale(const locale& from_locale, const char* locale_name, category new_category);

locale(const locale& from_locale, const string& locale_name, category new_category);

reemplaza en locale(locale_name, all) las facetas que se corresponden con una categoría replace_category para la cual replace_category & new_category es distinto de cero.

template<class Facet> locale(const locale& from_locale, Facet* new_facet);

reemplaza en (o agrega a) from_locale la faceta new_facet, si new_facet no es un puntero nulo.

Si el nombre de configuración regional locale_name es un puntero nulo o no válido, la función produce un runtime_error.

Ejemplo

// locale_locale.cpp
// compile with: /EHsc
#include <locale>
#include <iostream>
#include <tchar.h>
using namespace std;

int main( ) {

   // Second constructor
   locale loc ( "German_germany" );
   _TCHAR * s1 = _T("Das ist wei\x00dfzz."); // \x00df is the German sharp-s, it comes before z in the German alphabet
   _TCHAR * s2 = _T("Das ist weizzz.");
   int result1 = use_facet<collate<_TCHAR> > ( loc ).
      compare (s1, &s1[_tcslen( s1 )-1 ],  s2, &s2[_tcslen( s2 )-1 ] );
   cout << isalpha (_T ( '\x00df' ), loc ) << result1 << endl;

   // The first (default) constructor
   locale loc2;
   int result2 = use_facet<collate<_TCHAR> > ( loc2 ).
      compare (s1, &s1[_tcslen( s1 )-1 ],  s2, &s2[_tcslen( s2 )-1 ] );
   cout << isalpha (_T ( '\x00df' ), loc2 )  << result2 << endl;

   // Third constructor
   locale loc3 (loc2,loc, _M_COLLATE );
   int result3 = use_facet<collate<_TCHAR> > ( loc3 ).
      compare (s1, &s1[_tcslen( s1 )-1 ],  s2, &s2[_tcslen( s2 )-1 ] );
   cout << isalpha (_T ( '\x00df' ), loc3 ) << result3 << endl;

   // Fourth constructor
   locale loc4 (loc2, "German_Germany", _M_COLLATE );
   int result4 = use_facet<collate<_TCHAR> > ( loc4 ).
      compare (s1, &s1[_tcslen( s1 )-1 ],  s2, &s2[_tcslen( s2 )-1 ] );
   cout << isalpha (_T ( '\x00df' ), loc4 ) << result4 << endl;
}

locale::name

Devuelve el nombre de configuración regional almacenado.

string name() const;

Valor devuelto

Cadena que proporciona el nombre de la configuración regional.

Ejemplo

// locale_name.cpp
// compile with: /EHsc
#include <iostream>
#include <string>
#include <locale>

using namespace std;

int main( )
{
   locale loc1( "german" );
   locale loc2 = locale::global( loc1 );
   cout << "The name of the previous locale is: "
        << loc2.name( ) << "." << endl;
   cout << "The name of the current locale is: "
        << loc1.name( ) << "." << endl;
}
The name of the previous locale is: C.
The name of the current locale is: German_Germany.1252.

locale::operator=

Asigna una configuración regional.

const locale& operator=(const locale& other) noexcept;

locale::operator!=

Comprueba si dos configuraciones regionales son distintas.

bool operator!=(const locale& right) const;

Parámetros

right
Una de las configuraciones regionales cuya desigualdad se va a comprobar.

Valor devuelto

Un valor booleano que es true si las configuraciones regionales no son copias de la misma configuración local. Es false si las configuraciones regionales son copias de la misma configuración regional.

Comentarios

Dos configuraciones regionales son iguales si son la misma configuración regional, si una es una copia de la otra o si tienen nombres idénticos.

Ejemplo

// locale_op_ne.cpp
// compile with: /EHsc
#include <iostream>
#include <string>
#include <locale>

using namespace std;

int main( )
{
   locale loc1( "German_Germany" );
   locale loc2( "German_Germany" );
   locale loc3( "English" );

   if ( loc1 != loc2 )
      cout << "locales loc1 (" << loc1.name( )
      << ") and\n loc2 (" << loc2.name( ) << ") are not equal." << endl;
   else
      cout << "locales loc1 (" << loc1.name( )
      << ") and\n loc2 (" << loc2.name( ) << ") are equal." << endl;

   if ( loc1 != loc3 )
      cout << "locales loc1 (" << loc1.name( )
      << ") and\n loc3 (" << loc3.name( ) << ") are not equal." << endl;
   else
      cout << "locales loc1 (" << loc1.name( )
      << ") and\n loc3 (" << loc3.name( ) << ") are equal." << endl;
}
locales loc1 (German_Germany.1252) and
loc2 (German_Germany.1252) are equal.
locales loc1 (German_Germany.1252) and
loc3 (English_United States.1252) are not equal.

locale::operator()

Compara dos objetos basic_string según las reglas de comparación lexicográficas definidas por la faceta std::collate<charT> de esta configuración regional.

template <class CharType, class Traits, class Allocator>
bool operator()(
    const basic_string<CharType, Traits, Allocator>& left,
    const basic_string<CharType, Traits, Allocator>& right) const;

Parámetros

left
Primera cadena que se va a comparar.

right
Segunda cadena que se va a comparar.

Valor devuelto

  • true si left es lexicográficamente menor que right; de lo contrario, false.

Comentarios

La función miembro ejecuta eficazmente:

const collate<CharType>& fac = use_fac<collate<CharType>>(*this);

return (fac.compare(left.begin(), left.end(), right.begin(), right.end()) < 0);

Significa que puede usar un objeto de configuración regional como un objeto de función.

Ejemplo

// locale_op_compare.cpp
// compile with: /EHsc
#include <iostream>
#include <string>
#include <locale>

int main( )
{
   using namespace std;
   const wchar_t *sa = L"ztesting";
   const wchar_t *sb = L"\0x00DFtesting";
   basic_string<wchar_t> a( sa );
   basic_string<wchar_t> b( sb );

   locale loc( "German_Germany" );
   cout << loc( a,b ) << endl;

   const collate<wchar_t>& fac = use_facet<collate<wchar_t> >( loc );
   cout << ( fac.compare( sa, sa + a.length( ),
       sb, sb + b.length( ) ) < 0) << endl;
}
0
0

locale::operator==

Comprueba si dos configuraciones regionales son iguales.

bool operator==(const locale& right) const;

Parámetros

right
Una de las configuraciones regionales cuya igualdad se va a comprobar.

Valor devuelto

Un valor booleano que es true si las configuraciones regionales no son copias de la misma configuración local. Es false si las configuraciones regionales no son copias de la misma configuración regional.

Comentarios

Dos configuraciones regionales son iguales si son la misma configuración regional, si una es una copia de la otra o si tienen nombres idénticos.

Ejemplo

// locale_op_eq.cpp
// compile with: /EHsc
#include <iostream>
#include <string>
#include <locale>

using namespace std;

int main( )
{
   locale loc1( "German_Germany" );
   locale loc2( "German_Germany" );
   locale loc3( "English" );

   if ( loc1 == loc2 )
      cout << "locales loc1 (" << loc1.name( )
      << ")\n and loc2 (" << loc2.name( ) << ") are equal."
      << endl;
   else
      cout << "locales loc1 (" << loc1.name( )
      << ")\n and loc2 (" << loc2.name( ) << ") are not equal."
      << endl;

   if ( loc1 == loc3 )
      cout << "locales loc1 (" << loc1.name( )
      << ")\n and loc3 (" << loc3.name( ) << ") are equal."
      << endl;
   else
      cout << "locales loc1 (" << loc1.name( )
      << ")\n and loc3 (" << loc3.name( ) << ") are not equal."
      << endl;
}
locales loc1 (German_Germany.1252)
and loc2 (German_Germany.1252) are equal.
locales loc1 (German_Germany.1252)
and loc3 (English_United States.1252) are not equal.

Vea también

<locale>
Páginas de códigos
Nombres de configuración regional, idiomas y cadenas de país/región
Seguridad para subprocesos en la biblioteca estándar de C++