Condividi tramite


Classe locale

Classe che descrive un oggetto delle impostazioni locali che incapsula le informazioni specifiche delle impostazioni locali come set di facet che definiscono collettivamente un ambiente localizzato specifico.

Sintassi

class locale;

Osservazioni:

Un facet è un puntatore a un oggetto di una classe derivata dalla classe facet con un oggetto pubblico nel formato seguente:

static locale::id id;

È possibile definire un set aperto di tali facet. È inoltre possibile costruire un oggetto delle impostazioni locali che indica un numero arbitrario di facet.

I gruppi predefiniti di questi facet rappresentano le categorie di impostazioni locali tradizionalmente gestite nella libreria C standard dalla funzione setlocale.

Categoria collate (LC_COLLATE) include i facet:

collate<char>
collate<wchar_t>

Categoria ctype (LC_CTYPE) include i facet:

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>

Categoria monetary (LC_MONETARY) include i facet:

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

Categoria numeric (LC_NUMERIC) include i facet:

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>

Categoria time (LC_TIME) include i facet:

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

Categoria messages (LC_MESSAGES) include i facet:

messages<char>
messages<wchar_t>

L'ultima categoria è richiesta da POSIX, ma non dallo standard C.

Alcuni di questi facet predefiniti vengono usati dalle iostream classi per controllare la conversione di valori numerici da e verso sequenze di testo.

Un oggetto delle impostazioni locali della classe consente inoltre di archiviare un nome delle impostazioni locali come oggetto della classe string. L'uso di un nome delle impostazioni locali non valido per costruire un facet o un oggetto delle impostazioni locali genera un oggetto della classe runtime_error. Il nome delle impostazioni locali archiviate è "*" se l'oggetto impostazioni locali non può essere certo che le impostazioni locali in stile C corrispondano esattamente a quella rappresentata dall'oggetto . In caso contrario, è possibile stabilire impostazioni locali corrispondenti all'interno della libreria C standard, per un oggetto locale_objectdelle impostazioni locali, chiamando setlocale(LC_ALL , locale_object.il nome().c_str()).

In questa implementazione è inoltre possibile chiamare la funzione membro statica:

static locale empty();

per costruire un oggetto delle impostazioni locali privo di facet. Si tratta anche di impostazioni locali trasparenti. Se le funzioni modello has_facet e use_facet non riescono a trovare il facet richiesto in impostazioni locali trasparenti, consultano prima le impostazioni locali globali e quindi, se è trasparente, le impostazioni locali classiche. È quindi possibile scrivere:

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

Gli inserimenti successivi a cout vengono mediati dallo stato corrente delle impostazioni locali globali. È anche possibile scrivere:

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

cout.imbue(loc);

Le regole di formattazione numerica per gli inserimenti successivi a cout rimangono uguali a quelle delle impostazione locali C, anche quando le impostazioni locali globali forniscono regole mutevoli per l'inserimento di date e importi monetari.

Costruttori

Costruttore Descrizione
impostazioni locali Crea le impostazioni locali o una copia delle impostazioni locali oppure una copia delle impostazioni locali in cui un facet o una categoria è stata sostituita da un facet o da una categoria di altre impostazioni locali.

Typedef

Nome tipo Descrizione
category Tipo Integer che fornisce i valori della maschera di bit per indicare le famiglie di facet standard.

Funzioni membro

Funzione membro Descrizione
combine Inserisce un facet delle impostazioni locali specificate nelle impostazioni locali di destinazione.
name Restituisce il nome delle impostazioni locali archiviate.

Funzioni statiche

Nome Descrizione
classico La funzione membro statica restituisce un oggetto delle impostazioni locali che rappresenta le impostazioni locali C classiche.
globale Reimposta le impostazioni locali predefinite per il programma.

Operatori

Operatore Descrizione
operator= Assegna impostazioni locali.
operator!= Verifica l'ineguaglianza di due impostazioni locali.
operator( ) Confronta due oggetti basic_string.
operator== Verifica l'uguaglianza di due impostazioni locali.

Classi

Classe Descrizione
facet Classe utilizzata come classe base per tutti i facet delle impostazioni locali.
id La classe di membro fornisce un'identificazione dei facet univoca utilizzata come indice per cercare i facet nelle impostazioni locali.

Requisiti

Intestazione:<impostazioni locali>

Spazio dei nomi: std

locale::category

Tipo Integer che fornisce i valori della maschera di bit per indicare le famiglie di facet standard.

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;

Osservazioni:

Il tipo è sinonimo di un tipo int che può rappresentare un gruppo di elementi distinti di un tipo di maschera di bit specifico delle impostazioni locali della classe. In alternativa, può essere usato per rappresentare qualsiasi corrispondente categoria di impostazioni locali C. Gli elementi sono i seguenti:

  • collate, corrispondente alla categoria C LC_COLLATE

  • ctype, corrispondente alla categoria C LC_CTYPE

  • monetary, corrispondente alla categoria C LC_MONETARY

  • numeric, corrispondente alla categoria C LC_NUMERIC

  • time, corrispondente alla categoria C LC_TIME

  • messages, corrispondente alla categoria POSIX LC_MESSAGES

Altri due valori utili sono:

  • none, corrispondente a nessuna delle categorie C

  • all, corrispondente all'unione C di tutte le categorie LC_ALL

È possibile rappresentare un gruppo arbitrario di categorie usando un OR bit per bit con queste costanti, come in monetary | time.

locale::classic

La funzione membro statica restituisce un oggetto delle impostazioni locali che rappresenta le impostazioni locali C classiche.

static const locale& classic();

Valore restituito

Riferimento alle impostazioni locali C.

Osservazioni:

Le impostazioni locali C classiche sono le impostazioni locali ASCII in inglese (Stati Uniti) all'interno della libreria standard C. Si tratta delle impostazioni locali usate in modo implicito nei programmi che non sono internazionalizzati.

Esempio

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

Inserisce un facet delle impostazioni locali specificate nelle impostazioni locali di destinazione.

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

Parametri

source_locale
Impostazioni locali contenenti il facet da inserire nelle impostazioni locali di destinazione.

Valore restituito

La funzione membro restituisce un oggetto impostazioni locali che sostituisce o aggiunge al *this facet Facet elencato in source_locale.

Esempio

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

Classe utilizzata come classe base per tutti i facet delle impostazioni locali.

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

Osservazioni:

Non è possibile copiare o assegnare un oggetto della classe facet. È possibile creare e distruggere oggetti derivati dalla classe locale::facet ma non oggetti della classe di base proper. In genere, si costruisce un oggetto _Myfac derivato da facet quando si costruisce un localeoggetto , come in locale loc(locale::classic(), new _Myfac);

In questi casi, il costruttore per la classe facet base deve avere un argomento zero references . Quando l'oggetto non è più necessario, viene eliminato. Specificare un argomento di riferimento diverso da zero solo in quei rari casi in cui si assume la responsabilità per la durata dell'oggetto.

locale::global

Reimposta le impostazioni locali predefinite per il programma. Questa chiamata influisce sulle impostazioni locali globali sia per C che per C++.

static locale global(const locale& new_default_locale);

Parametri

new_default_locale
Impostazioni locali che devono essere usate come predefinite dal programma.

Valore restituito

Impostazioni locali precedenti alla reimpostazione delle impostazioni locali predefinite.

Osservazioni:

All'avvio del programma, le impostazioni locali globali coincidono con le impostazioni locali classiche. La funzione global() chiama setlocale( LC_ALL, loc.name. c_str()) per definire delle impostazioni locali corrispondenti nella libreria C standard.

Esempio

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

La classe di membro fornisce un'identificazione dei facet univoca utilizzata come indice per cercare i facet nelle impostazioni locali.

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

Osservazioni:

La classe membro descrive l'oggetto membro statico richiesto da ciascun facet delle impostazioni locali univoco. Non è possibile copiare o assegnare un oggetto della classe id.

locale::locale

Crea le impostazioni locali o una copia delle impostazioni locali oppure una copia delle impostazioni locali in cui un facet o una categoria è stata sostituita da un facet o da una categoria di altre impostazioni locali. Include anche un distruttore.

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();

Parametri

locale_name
Nome delle impostazioni locali.

from_locale
Impostazioni locali che devono essere copiate per la costruzione delle nuove impostazioni locali.

Altro
Impostazioni locali da cui selezionare una categoria.

new_category
Categoria da sostituire nelle impostazioni locali costruite.

new_facet
Facet da sostituire nelle impostazioni locali costruite.

Osservazioni:

Il primo costruttore inizializza l'oggetto in modo che corrisponda alle impostazioni locali globali. I secondi e i terzi costruttori inizializzano tutte le categorie di impostazioni locali in modo che il comportamento sia coerente con il nome delle impostazioni locali locale_name. I costruttori rimanenti copiano from_locale, con le eccezioni indicate:

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

sostituisce da Altri facet corrispondenti a una categoria C per cui C & new_category è diverso da 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);

sostituisce da questi facet corrispondenti a una categoria replace_category per cui replace_category & new_category è diverso da locale(locale_name, all) zero.

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

sostituisce in (o aggiunge a) from_locale il new_facet facet, se new_facet non è un puntatore Null.

Se il nome delle impostazioni locali locale_name è un puntatore Null o altrimenti non è valido, la funzione genera runtime_error.

Esempio

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

Restituisce il nome delle impostazioni locali archiviate.

string name() const;

Valore restituito

Stringa che fornisce il nome delle impostazioni locali.

Esempio

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

Assegna impostazioni locali.

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

locale::operator!=

Verifica l'ineguaglianza di due impostazioni locali.

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

Parametri

right
Una delle impostazioni locali di cui verificare la disuguaglianza.

Valore restituito

Valore booleano che è true se le impostazioni locali non sono copie delle stesse impostazioni locali. false Se le impostazioni locali sono copie delle stesse impostazioni locali.

Osservazioni:

Due impostazioni locali sono uguali se sono le stesse impostazioni locali, se una è una copia dell'altra o se hanno nomi identici.

Esempio

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

Confronta due basic_string oggetti in base alle regole di confronto lessicografiche definite dal facet di std::collate<charT> queste impostazioni locali.

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

Parametri

left
Prima stringa da confrontare.

right
Seconda stringa da confrontare.

Valore restituito

  • true se left è lessicograficamente minore di destra, in caso contrario false.

Osservazioni:

La funzione membro gestisce in modo efficace quanto segue:

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

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

Ciò significa che è possibile usare un oggetto impostazioni locali come oggetto funzione.

Esempio

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

Verifica l'uguaglianza di due impostazioni locali.

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

Parametri

right
Una delle impostazioni locali di cui verificare l'uguaglianza.

Valore restituito

Valore booleano che è true se le impostazioni locali sono copie delle stesse impostazioni locali. false Se le impostazioni locali non sono copie delle stesse impostazioni locali.

Osservazioni:

Due impostazioni locali sono uguali se sono le stesse impostazioni locali, se una è una copia dell'altra o se hanno nomi identici.

Esempio

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

Vedi anche

<impostazioni locali>
Tabelle codici
Nomi delle impostazioni locali, lingue e stringhe relative a paesi
Thread Safety in the C++ Standard Library (Sicurezza dei thread nella libreria standard C++)