Клас std::locale призначений для інкапсуляції культурних особливостей, і який покращує відповідність програми, яка його використовує, культурним особливостям користувачів.
Під час конструювання конкретного об'єкта класу std::locale, локалізаційний механізм ініціалізує усі реалізовані аспекти-особливості притаманні культурі (у вигляді окремих об'єктів, дочірніх класу facet).
Об'єкти класу std::locale, зазвичай конструюються за допомогою вказаного імені (аналогічно до функції setlocale з файлу clocale), або за допомогою іншого об'єкта класу locale. Також можливо поєднювати аспекти-особливості з різних об'єктів класу locale.
Кожна програма містить власний об’єкт locale, який являється її глобальним об’єктом локалі. Під час запуску програми, даною локаллю являється об’єкт classic, але він може бути зміненим за допомогою виклику методу std::locale::global. Об’єкт глобальної локалі обирається за допомогою вказаних за замовчуванням класів.
Глобальний об’єкт локалі також впливає на локаль бібліотеки мови програмування C (Сі, перегляньте функцію setlocale) - коли даний об’єкт за допомогою методу std::locale::global, локаль бібліотеки мови програмування C (Сі) модифікується відповідно.
Конкретні об’єкти класу std::locale можуть бути використаними для доступу до асоційованих з ними об’єктами, які відповідають за особливості культури, і отримання їхніх механізмів форматування данних. Вони також можуть вбудовуватись у спеціальні потокові об’єкти (на подобі cin, cout або файлові потоки), за допомогою виклику методу imbue даного потоку.
Для використання даного класу необхідно підключити у коді файл locale:
#include <locale> /* клас locale і усе інше */
Поля, методи і вбудовані типи
typedef int category ;
Даний вбудований тип класу призначений для опису категорії аспектів локалі. Він являється псевдонімом цілочисельного типу int, і повинен використовуватись разом з комбінаціями бітових масок, які присутні в якості констант у класі locale:
- locale::collate (клас-аспект facet: collate);
- locale::ctype (клас-аспекти facet: ctype, codecvt);
- locale::monetary (клас-аспекти facet: moneypunct, money_get, money_put);
- locale::numeric (клас-аспекти facet: numpunct, num_get, num_put);
- locale::time (клас-аспекти facet: time_get, time_put);
- locale::messages (клас-аспекти facet: messages);
- locale::all (усі попередні);
- locale::none (жоден з попередніх);
Кожен з даних категорій оголошено в якості static const int поля класу local, значення яких може бути скомбінованим з іншими в якості бітової маски, використовуючи бітовий оператор "|".
Значення даних статичних констант не обов'язково співпадає з значеннями відповідних констант з бібліотеки мови C (Сі).
class facet ;
Внутрішній клас locale. Являється базовим класом для аспектів локалі. Дочірні класи facet допомагають описати культурні особливості для кожної локалі.
Спеціальні аспекти локалі можуть бути створеними, успадковуючи даний вбудований клас locale, утримуючи статичний член типу locale::id, і набір внутрішніх константних статичних членів.
class id ;
id аспекта локалі. Даний вбудований у клас locale тип призначений для оголошення поля id дочірнього класу facet, який унікальний для усіх аспектів. Він ідентифікує тип аспекта.
locale() throw() ;
/* конструктор копіювання */
locale (const locale& x) throw() ;
/* конструювання за іменем */
explicit locale (const char* std_name) ;
locale (const locale& x, const char* std_name, category cats) ;
/* комбінуючий конструктор */
template <class Facet>
locale (const locale& x, const locale& y, category cats) ;
/* спеціалізований аспект facet */
locale (const locale& x, Facet* f) ;
/* деструктори */
~locale() throw() ;
Конструктори ідеструктор класу locale.
static const locale& classic () ;
Метод, який повертає "класичну" локаль, яка відповідає семантиці локалі з назвою "C" (локаль за умовчанням).
template <class Facet> locale combine (const locale& x) const ;
Конструює копію локалі, змінюючи один відповідний аспект дочірнього класу facet, який береться з параметру x.
static locale global (const locale& loc) ;
Встановлює глобальну локаль.
string name() const ;
Повертає назву локалі. Якщо локаль немає імені, метод повертає значення "*".
bool operator != (const locale& x) const ;
Порівнює дві локалі і повертає результат обернений відносно оператора "operator==".
template <class charT, class Traits, class Allocator>
bool operator() (const basic_string<charT,Traits,Allocator>& s1,
const basic_string<charT,Traits,Allocator>& s2) const ;
Порівнює рядки використовуючи поточну локаль. s1 i s2 - рядки для порівняння. Оператор повертає true, якщо рядок s1 повинен сортуватися перед s2 і falce в іншому випадку.
const locale& operator = (const locale& x) throw() ;
Присвоює значення x до об'єкта локалі, замінюючи його поточне значення.
bool operator == (const locale& x) const ;
Порівнює два об'єкти локалей. Повертає значення true, якщо два об'єкти локалі являються одним об'єктом, або одна локаль являється копією іншої, або їхні назви співпадають, і значення false у іншому випадку.
Приклад
Розглянемо простий приклад використання об'єктів класу locale.
#include <locale> /* клас std::locale */
#include <iostream> /* об'єкт cout */
using namespace std ;
/* головна функція програми */
int main (int argc, char** argv)
{
/* створюємо піддослідні локалі */
locale sloc ; /* стандартна */
locale defloc ("") ; /* бажана користувачу, з змінних середовища */
locale cloc ("en_GB.UTF-8") ; /* створюємо за ім'ям */
/* виводимо у термінал імена локалей */
cout << "стандартна локаль: " << sloc.name () << endl ;
cout << "локаль за умовчанням: " << defloc.name () << endl ;
cout << "конкретна локаль: " << cloc.name () << endl ;
/* змінюємо локаль об'єкта cout і виводимо дані */
cout.imbue (defloc) ;
cout << "бажана локаль: " << 3.1415f << " " << 1024*10.5f << endl ;
cout.imbue (cloc) ;
cout << "конкретна локаль: " << 3.1415f << " " << 1024*10.5f << endl ;
/* використовуємо оператор порівняння
** і виводимо повідомлення у термінал */
cout.imbue (defloc) ;
cout << "стандартна і бажана локаль " ;
if (sloc!=defloc)
{ cout << "не " ; }
cout << "співпадають" << endl ;
return 0 ;
}
Вивід програми: