ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4275
Скачиваний: 28
Глава 32. Обработка исключительных ситуаций <signal.h>
381
if(raise(SIGINT))
{
printf("Raise failed.\n");
return 2;
}
printf("OK.\n");
/* восстанавливаем предыдущий обработчик */
signal(SIGINT, f);
return 0;
}
Г Л А В А
33
Поддержка локализации
<locale.h>
Заголовочный файл locale.h предназначен для управления пред-
ставлением и обработкой данных, специфических для различных
регионов. Кроме специфических определений, в этом заголовоч-
ном файле также определен макрос
NULL
.
33.1. Локальность
Информация, описывающая представление и правила обработки
данных для какого-то региона, называется
локальностью
(locale).
Процесс преобразования данных в локальное представление на-
зывается
локализацией
.
Каждая локальность имеет имя, которое задается символьной
строкой. В стандарте языка программирования C предопределены
имена двух локальностей:
"C"
— локальность, используемая по умолчанию;
""
— местная (native) локальность.
В конкретной реализации могут быть также определены и другие
локальности.
Перед передачей управления программе среда исполнения уста-
навливает локальность
"C"
.
Глава 33. Поддержка локализации <locale.h>
383
33.2. Локальные категории
Локальность разбивается на разделы, каждый из которых содер-
жит информацию, связанную по смыслу или назначению. Разде-
лы локальности нумеруются. Номер раздела локальности называ-
ется
локальной категорией
. В заголовочном файле locale.h опре-
делены следующие макросы для локальных категорий:
LC_ALL
— все локальные категории;
LC_COLLATE
— локальная категория, связанная с работой функ-
ций
strcoll
и
strxfrm
;
LC_CTYPE
— локальная категория, связанная с работой функций
классификации символов;
LC_MONETARY
— локальная категория, связанная с форматиро-
ванием денежных значений;
LC_NUMERIC
— локальная категория, связанная с форматирова-
нием данных с плавающей точкой;
LC_TIME
— локальная категория, связанная с работой функции
strftime
.
Каждый из этих макросов определяет некоторое целочисленное
константное выражение.
В заголовочном файле locale.h могут быть также определены и
другие локальные категории.
33.3. Установка локальности
Для установки локальности, которая будет управлять обработкой
и форматированием специфических для региона данных, предна-
значена функция
setlocale
, которая имеет следующий прототип:
char *setlocale(int category, const char *
locale
);
Параметр
category
должен содержать локальную категорию, а
параметр
locale
указывать на имя локальности.
Функция
setlocale
устанавливает локальную категорию, задан-
ную параметром
category
, из локальности на которую указывает
Часть III. Стандартная библиотека языка программирования C
384
параметр
locale
. В случае успешного завершения функция воз-
вращает указатель на строку, описывающую установленную ло-
кальность и категорию, а в случае неудачи —
NULL
.
Если в параметре
locale
установить значение
NULL
, то функция
вернет указатель на строку, описывающую локальную категорию,
заданную параметром
category
для текущей локальности.
В листинге 33.1 приведен пример использования функции
setlocale
.
Листинг 33.1. Установка местной локальности
#include<stdio.h>
#include<locale.h>
int main(void)
{
char *locale;
locale = setlocale(LC_ALL, "");
printf("%s\n", locale); /* Russian_Russia.1251 */
printf("%g\n", 10.5); /* 10,5 */
return 0;
}
33.4. Форматы числовых
и денежных данных
Информация о том, как форматировать числовые и денежные
данные для локального представления, хранится в структуре типа
lconv
, поля которой:
char *decimal_point; /* символ десятичной точки в не
денежных данных */
char *thousands_sep; /* разделитель для числовых групп
слева от десятичной точки в не денежных данных */
char *grouping; /* строка, задающая количество цифр в
каждой группе в не денежных данных;
Глава 33. Поддержка локализации <locale.h>
385
каждый символ представляет десятичное число, которое
обозначает количество цифр в группе;
ноль обозначает, что предыдущее значение будет
использоваться для всех оставшихся групп;
значение CHAR_MAX обозначает, что группировка цифр в числе
прекращается */
char *int_curr_symbol; /* символ денег, определенный
стандартом ISO 4217 */
char *currency_symbol; /* локальный символ денег */
char *mon_decimal_point; /* символ десятичной точки в
денежных данных */
char *mon_thousands_sep; /* разделитель для числовых групп
слева от десятичной точки в денежных данных */
char *mon_grouping; /* строка, задающая количество цифр в
каждой группе в денежных данных; формат строки такой же,
как и в поле grouping */
char *positive_sign; /* знак положительного значения для
денежных величин */
char *negative_sign; /* знак отрицательного значения для
денежных величин */
char int_frac_digits; /* количество цифр после десятичной
точки для международного представления денежных данных */
char frac_digits; /* количество цифр после десятичной точки
для представления денежных данных */
char p_cs_precedes; /* позиция символа денег для
положительных денежных значений:
0 — символ денег следует за денежным значением;
1 — символ денег предшествует денежному значению */
char n_cs_precedes; /* позиция символа денег для
отрицательных денежных значений:
0 — символ денег следует за денежным значением;
1 — символ денег предшествует денежному значению */
char p_sep_by_space; /* для положительного денежного
значения:
0 — символ денег не отделен от денежного значения;
1 — символ денег отделен от денежного значения пробелом */
char n_sep_by_space; /* для отрицательного денежного
значения:
0 — символ денег не отделен от денежного значения;
1 — символ денег отделен от денежного значения пробелом */