Настройка локали в языке C++

В языке C++ настройка локали производится с помощью класса locale. Для создания объекта наиболее часто используются следующие конструкторы:

#include <locale>
locale() throw();
explicit locale(const char *locname);
explicit locale(const string &locname);
locale(const locale &other) throw();
locale(const locale &base, const char *locname, category cat);
locale(const locale &base, const string &locname, category cat);

Первый конструктор создает копию текущей глобальной локали, если она была предварительно установлена с помощью статического метода global(), или классическую локаль (возвращаемую статическим методом classic()):

std::locale loc;
std::cout << loc.name() << std::endl; // C

В этом примере для получения названия локали мы воспользовались методом name(). Прототип метода:

string name() const;

Второй и третий конструкторы позволяют задать название локали. Вместо названия можно указать пустую строку. В этом случае будет использоваться локаль, настроенная в системе. Пример:

std::locale loc1("C");
std::cout << loc1.name() << std::endl; // C
std::locale loc2(std::string("C"));
std::cout << loc2.name() << std::endl; // C

Если указанной локали нет, то генерируется исключение runtime_error. Пример обработки исключения:

std::locale loc;
try {
   loc = std::locale("Russian_Russia.1251");
   std::cout << loc.name() << std::endl;
} catch (std::runtime_error &e) {
   std::cout << "Error" << std::endl;
}
/*
В VC++:  Russian_Russia.1251
В MinGW: Error
*/
Обратите внимание

Четвертый конструктор создает копию объекта:

std::locale loc1("C");
std::locale loc2(loc1);
std::cout << loc2.name() << std::endl; // C

Пятый и шестой конструкторы в параметре cat позволяют указать следующие флаги (или их комбинацию через побитовый оператор |):

  • locale::all — устанавливает локаль для всех категорий;
  • locale::collate — для сравнения строк;
  • locale::ctype — для перевода символов в нижний или верхний регистр;
  • locale::monetary — для отображения денежных единиц;
  • locale::numeric — для форматирования дробных чисел;
  • locale::time — для форматирования вывода даты и времени;
  • locale::messages;
  • locale::none — флаги не установлены.

Пример создания объекта класса locale для всех категорий:

std::locale loc;
loc = std::locale(loc, "C", std::locale::all);
std::cout << loc.name() << std::endl; // C

Создать объект класса locale для классической локали C позволяет статический метод classic(). Прототип метода:

static const locale &classic();

Пример:

std::locale loc = std::locale::classic();
std::cout << loc.name() << std::endl; // C

Чтобы установить локаль на глобальном уровне следует передать созданный объект в статический метод global(). Метод принимает объект класса locale и возвращает прежнюю настройку локали. Прототип метода global():

static locale global(const locale &loc);

Пример:

std::locale loc("C");
std::locale::global(loc);

В классе locale выполнена перегрузка операторов =, == и !=. Прототипы методов:

const locale &operator=(const locale &other) throw();
bool operator==(const locale &other) const throw();
bool operator!=(const locale &other) const throw();

Пример сравнения локалей:

if (std::locale() == std::locale::classic()) {
   std::cout << "C" << std::endl;
}

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов