Partilhar via


Classe locale

A classe que descreve um objeto de localidade que encapsula informações específicas à cultura como um conjunto de facetas que definem coletivamente um ambiente localizado específico.

Sintaxe

class locale;

Comentários

Uma faceta é um ponteiro para um objeto de uma classe derivada da classe facet que tem um objeto público da forma:

static locale::id id;

Você pode definir um conjunto de final aberto dessas facetas. Também é possível construir um objeto de localidade que designa um número arbitrário de facetas.

Os grupos predefinidos dessas facetas representam as categorias de localidade normalmente gerenciadas na Biblioteca C Padrão pela função setlocale.

A categoria collate (LC_COLLATE) inclui as facetas:

collate<char>
collate<wchar_t>

A categoria ctype (LC_CTYPE) inclui as 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>

A categoria monetary (LC_MONETARY) inclui as 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>>

A categoria numeric (LC_NUMERIC) inclui as 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>

A categoria time (LC_TIME) inclui as 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>>

A categoria messages (LC_MESSAGES) inclui as facetas:

messages<char>
messages<wchar_t>

(A última categoria é exigida pelo POSIX, mas não pelo C Standard.)

Algumas dessas facetas predefinidas são usadas pelas classes iostream para controlar a conversão bidirecional de valores numéricos para e de sequências de texto.

Um objeto da localidade de classe também armazena um nome de localidade como um objeto da classe string. Usar um nome inválido de localidade para construir uma faceta ou um objeto de localidade lançará um objeto da classe runtime_error. O nome da localidade armazenado será "*" se o objeto de localidade não puder ter certeza de que uma localidade de estilo C corresponde exatamente àquela representada pelo objeto. Caso contrário, você poderá estabelecer uma localidade correspondente na Biblioteca de C Padrão para um objeto de localidade locale_object chamando setlocale(LC_ALL , locale_object.nome().c_str()).

Nessa implementação, também é possível chamar a função membro estática:

static locale empty();

para construir um objeto de localidade que não tenha nenhuma faceta. Também é uma localidade transparente. Se as funções de modelo has_facet e use_facet não puderem encontrar a faceta solicitada em uma localidade transparente, elas consultarão primeiro a localidade global e, em seguida, se for transparente, a localidade clássica. Portanto, é possível escrever:

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

As inserções subsequentes em cout serão mediadas pelo estado atual da localidade global. Você ainda pode escrever:

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

cout.imbue(loc);

As regras de formatação numérica para inserções subsequentes em cout permanecem iguais as da localidade C, mesmo que a localidade global forneça regras que se modificam para inserção de valores monetários e de data.

Construtores

Construtor Descrição
locale Cria uma localidade, ou uma cópia de uma localidade, ou uma cópia da localidade em que uma faceta ou uma categoria foi substituída por uma faceta ou categoria de outra localidade.

Typedefs

Nome do tipo Descrição
category Um tipo de inteiro que fornece valores de bitmask para denotar famílias padrão de facetas.

Funções de membro

Função de membro Descrição
combine Insere uma faceta de uma localidade especificada em uma localidade de destino.
name Retorna o nome da localidade armazenado.

Funções estáticas

Nome Descrição
clássico A função membro estática retorna um objeto de localidade que representa a localidade C clássica.
global Redefine o local padrão do programa.

Operadores

Operador Descrição
operator= Atribui uma localidade.
operator!= Testa a desigualdade de duas localidades.
operator( ) Compara dois objetos basic_string.
operator== Testa a igualdade de duas localidades.

Classes

Classe Descrição
facet Uma classe que serve como a classe base para todas as facetas de localidade.
id A classe do membro fornece uma identificação exclusiva da faceta usada como um índice para procurar facetas em uma localidade.

Requisitos

Cabeçalho:<locale>

Namespace: std

localidade::categoria

Um tipo de inteiro que fornece valores de bitmask para denotar famílias padrão de facetas.

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;

Comentários

O tipo é um sinônimo para um tipo int que pode representar um grupo de elemento distintos de um tipo de bitmask local de uma localidade de classe ou pode ser usado para representar qualquer uma das categorias de localidade C correspondentes. Os elementos são:

  • collate, correspondente à categoria C LC_COLLATE

  • ctype, correspondente à categoria C LC_CTYPE

  • monetary, correspondente à categoria C LC_MONETARY

  • numeric, correspondente à categoria C LC_NUMERIC

  • time, correspondente à categoria C LC_TIME

  • messages, correspondente à categoria POSIX LC_MESSAGES

Os dois valores mais úteis são:

  • none, correspondente a nenhuma das categorias C

  • all, correspondente à união de todas as categorias C LC_ALL

É possível representar um grupo arbitrário de categorias usando um OR bit a bit com essas constantes, como em monetary | time.

localidade::clássico

A função membro estática retorna um objeto de localidade que representa a localidade C clássica.

static const locale& classic();

Valor de retorno

Uma referência à localidade C.

Comentários

A localidade C clássica é a localidade ASCII em inglês dos EUA dentro da biblioteca Standard C. É a localidade usada implicitamente em programas que não são internacionalizados.

Exemplo

// 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.

localidade::combinar

Insere uma faceta de uma localidade especificada em uma localidade de destino.

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

Parâmetros

source_locale
A localidade que contém a faceta a ser inserida na localidade de destino.

Valor de retorno

A função membro retorna um objeto de localidade que substitui ou adiciona *this à faceta Facet listada em source_locale.

Exemplo

// 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;
}

Classe facet

Uma classe que serve como a classe base para todas as facetas de localidade.

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

Comentários

Não é possível copiar nem atribuir um objeto da classe facet. É possível construir e destruir objetos derivados da classe locale::facet, mas não objetos da classe base correta. Normalmente, você constrói um objeto _Myfac derivado de facet quando constrói um locale, como em locale loc(locale::classic(), new _Myfac);.

Nesses casos, o construtor da classe base facet deve ter um argumento references igual a zero. Quando o objeto não for mais necessário, ele será excluído. Forneça um argumento references diferente de zero somente nos casos raros em que você assume a responsabilidade pelo tempo de vida do objeto.

localidade::global

Redefine a localidade padrão do programa. Essa chamada afeta a localidade global de C e C++.

static locale global(const locale& new_default_locale);

Parâmetros

new_default_locale
A localidade a ser usada como localidade padrão pelo programa.

Valor de retorno

A localidade anterior antes da redefinição da localidade padrão.

Comentários

Na inicialização do programa, a localidade global será a mesma que a localidade clássica. A função global() chama setlocale( LC_ALL, loc.name. c_str()) para estabelecer uma localidade correspondente na biblioteca C padrão.

Exemplo

// 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

Classe id

A classe do membro fornece uma identificação exclusiva da faceta usada como um índice para procurar facetas em uma localidade.

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

Comentários

A classe membro descreve o objeto de membro estático exigido por cada faceta de localidade exclusiva. Não é possível copiar nem atribuir um objeto da classe id.

localidade::localidade

Cria uma localidade, ou uma cópia de uma localidade, ou uma cópia da localidade em que uma faceta ou uma categoria foi substituída por uma faceta ou categoria de outra localidade. Também inclui um destruidor.

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
Nome de uma localidade.

from_locale
Uma localidade que deve ser copiada ao construir uma nova localidade.

Outras
Uma localidade da qual se deve selecionar uma categoria.

new_category
A categoria a ser substituída na localidade construída.

new_facet
A faceta a ser substituída na localidade construída.

Comentários

O primeiro construtor inicializa o objeto de acordo com a localidade global. O segundo e o terceiro construtor inicializam todas as categorias de localidade para que elas tenham um comportamento consistente com o nome de localidade locale_name. Os construtores restantes copiam from_locale, com as seguintes exceções:

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

substitui de Outros as facetas correspondentes a uma categoria C para a qual C & new_category é diferente de zero.

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

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

substitui em locale(locale_name, all) as facetas correspondentes a uma categoria replace_category para a qual replace_category & new_category é diferente de zero.

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

substitui em (ou adiciona a) from_locale a faceta new_facet, quando new_facet não é um ponteiro nulo.

Se um nome de localidade locale_name for um ponteiro nulo ou inválido, a função lançará o runtime_error.

Exemplo

// 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;
}

localidade::nome

Retorna o nome da localidade armazenado.

string name() const;

Valor de retorno

Uma cadeia de caracteres que fornece o nome da localidade.

Exemplo

// 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=

Atribui uma localidade.

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

localidade::operador!=

Testa a desigualdade de duas localidades.

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

Parâmetros

direita
Uma das localidades que terá sua desigualdade testada.

Valor de retorno

Um valor booliano que será true se as localidades não forem cópias da mesma localidade. Será false se as localidades forem cópias da mesma localidade.

Comentários

Duas localidades serão iguais se forem a mesma localidade, se uma for cópia da outra ou se tiverem nomes idênticos.

Exemplo

// 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.

localidade::operador()

Compara dois objetos basic_string de acordo com as regras de comparação lexicográfica definidas pela faceta std::collate<charT> dessa localidade.

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

esquerda
A primeira cadeia de caracteres a ser comparada.

direita
A segunda cadeia de caracteres a ser comparada.

Valor de retorno

  • true se esquerda for lexicograficamente menor que direita, caso contrário false.

Comentários

A função membro é executada efetivamente:

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

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

Isso significa que você pode usar um objeto de localidade como um objeto de função.

Exemplo

// 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

localidade::operador==

Testa a igualdade de duas localidades.

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

Parâmetros

direita
Uma das localidades que terá sua igualdade testada.

Valor de retorno

Um valor booliano que será true se as localidades forem cópias da mesma localidade. Será false se as localidades não forem cópias da mesma localidade.

Comentários

Duas localidades serão iguais se forem a mesma localidade, se uma for cópia da outra ou se tiverem nomes idênticos.

Exemplo

// 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.

Confira também

<locale>
Páginas de código
Nomes de localidades, idiomas e cadeias de caracteres de país/região
Acesso Thread-Safe na Biblioteca Padrão C++