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_COLLATEctype
, correspondente à categoria C LC_CTYPEmonetary
, correspondente à categoria C LC_MONETARYnumeric
, correspondente à categoria C LC_NUMERICtime
, correspondente à categoria C LC_TIMEmessages
, correspondente à categoria POSIX LC_MESSAGES
Os dois valores mais úteis são:
none
, correspondente a nenhuma das categorias Call
, 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áriofalse
.
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++