Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Настройка локали в языке 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
*/
C
. Попытка указать любое другое название приводит к исключению, поэтому приходится использовать функцию setlocale()
вместо класса locale
.Четвертый конструктор создает копию объекта:
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;
}
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов