Стандартная библиотека C -<locale.h>
Введение
<locale.h>Является заголовочным файлом в стандартной библиотеке C, используется для поддержки интернационализации и локализации программ. Он предоставляет набор функций и макросов для установки или запроса информации о локализации программы, такой как даты, время, валюта, форматы чисел и т. д.
Далее мы представим некоторые макросы, а также важную структуру.struct lconvи две важные функции.
Библиотечные макросы
Макросы, определённые в заголовочном файле locale.h, перечислены ниже; эти макросы будут использоваться в двух функциях, перечисленных ниже:
| Порядковый номер | Макросы и описание |
|---|---|
| 1 | LC_ALL Используется для установки или запроса всех категорий локализации. |
| 2 | LC_COLLATE Используется для установки или запроса информации локализации для сравнения строк. |
| 3 | LC_CTYPE Используется для установки или запроса информации локализации для обработки символов. |
| 4 | LC_MONETARY Используется для установки или запроса информации локализации для денежного формата. |
| 5 | LC_NUMERIC Используется для установки или запроса информации локализации для числового формата (например, символа десятичной точки). |
| 6 | LC_TIME Используется для установки или запроса информации о локализации для формата времени. |
| 7 | locale_t Типы, представляющие информацию о локали. |
Библиотечные функции
Функции, определённые в заголовочном файле locale.h, перечислены ниже:
| Порядковый номер | Функции и описание |
|---|---|
| 1 | char *setlocale(int category, const char *locale) Устанавливает или считывает информацию о локализации. |
| 2 | struct lconv *localeconv(void) Устанавливает или считывает информацию о локализации. |
| 3 | locale_t newlocale(int category_mask, const char *locale, locale_t base) Создаёт новый объект локализации. |
| 4 | freelocale(locale_t locale) Освобождает объект локализации. |
| 5 | locale_t uselocale(locale_t newloc) Устанавливает или запрашивает объект локализации потока. |
Пример
Установка и запрос информации о локализации:
Пример
#include <locale.h>
int main() {
// Установить информацию о локали в настройки по умолчанию из переменных среды пользователя
setlocale(LC_ALL, "");
// Получить и вывести информацию о текущей локали
printf("Current locale for LC_ALL: %s\n", setlocale(LC_ALL, NULL));
printf("Current locale for LC_TIME: %s\n", setlocale(LC_TIME, NULL));
printf("Current locale for LC_NUMERIC: %s\n", setlocale(LC_NUMERIC, NULL));
return 0;
}
Результат компиляции:
Current locale for LC_ALL: zh_CN.UTF-8 Current locale for LC_TIME: zh_CN.UTF-8 Current locale for LC_NUMERIC: zh_CN.UTF-8
Получение информации о числовом и денежном форматах:
Пример
#include <locale.h>
int main() {
// Установить информацию о локали в настройки по умолчанию из переменных среды пользователя
setlocale(LC_ALL, "");
// Получение локализованной информации о числовом и денежном форматах
struct lconv *lc = localeconv();
// Вывод информации о числовом и денежном форматах
printf("Символ десятичной точки: %s\n", lc->decimal_point);
printf("Разделитель тысяч: %s\n", lc->thousands_sep);
printf("Currency symbol: %s\n", lc->currency_symbol);
return 0;
}
Результат компиляции:
Decimal point character: . Thousands separator: , Currency symbol: ¥
Использование пользовательского объекта локализации:
Пример
#include <locale.h>
#include <xlocale.h>
int main() {
// Создать новый объект локали, используя настройку локали "en_US.UTF-8"
locale_t newloc = newlocale(LC_ALL_MASK, "en_US.UTF-8", (locale_t)0);
// Установить объект локали текущего потока в новый объект локали
locale_t oldloc = uselocale(newloc);
// Получить и вывести информацию о локализации текущего потока
printf("Current locale for LC_NUMERIC: %s\n", setlocale(LC_NUMERIC, NULL));
// Освободить новый объект локали
uselocale(oldloc);
freelocale(newloc);
return 0;
}
Результат компиляции:
Current locale for LC_NUMERIC: C
Структура библиотеки
typedef struct {
char *decimal_point;
char *thousands_sep;
char *grouping;
char *int_curr_symbol;
char *currency_symbol;
char *mon_decimal_point;
char *mon_thousands_sep;
char *mon_grouping;
char *positive_sign;
char *negative_sign;
char int_frac_digits;
char frac_digits;
char p_cs_precedes;
char p_sep_by_space;
char n_cs_precedes;
char n_sep_by_space;
char p_sign_posn;
char n_sign_posn;
} lconv
Ниже приведено описание каждого поля:
| Порядковый номер | Поля и описание |
|---|---|
| 1 | decimal_point Символ десятичной точки, используемый для неденежных значений. |
| 2 | thousands_sep Разделитель тысяч, используемый для неденежных значений. |
| 3 | grouping Строка, представляющая размер каждой группы цифр в неденежных величинах. Каждый символ представляет целочисленное значение, и каждое целое число задаёт количество цифр в текущей группе. Значение 0 означает, что предыдущее значение будет применяться к оставшимся группам. |
| 4 | int_curr_symbol Строка, используемая для международного символа валюты. Первые три символа задаются стандартом ISO 4217:1987, а четвертый символ используется для отделения символа валюты от денежной суммы. |
| 5 | currency_symbol Локальный символ, используемый для валюты. |
| 6 | mon_decimal_point Символ десятичной точки, используемый для денежных значений. |
| 7 | mon_thousands_sep Разделитель тысяч, используемый для денежных значений. |
| 8 | mon_grouping Строка, представляющая размер каждой группы цифр в денежных значениях. Каждый символ представляет целочисленное значение, и каждое целое число задает количество цифр в текущей группе. Значение 0 означает, что предыдущее значение будет применяться к оставшимся группам. |
| 9 | positive_sign Символ, используемый для положительных денежных значений. |
| 10 | negative_sign Символ, используемый для отрицательных денежных значений. |
| 11 | int_frac_digits Количество цифр, отображаемых после десятичной точки в международных денежных значениях. |
| 12 | frac_digits Количество цифр, отображаемых после десятичной точки в денежных значениях. |
| 13 | p_cs_precedes Если равно 1, currency_symbol появляется перед положительным денежным значением. Если равно 0, currency_symbol появляется после положительного денежного значения. |
| 14 | p_sep_by_space Если равно 1, между currency_symbol и положительным денежным значением используется пробел. Если равно 0, пробел между currency_symbol и положительным денежным значением не используется. |
| 15 | n_cs_precedes Если равно 1, currency_symbol появляется перед отрицательным денежным значением. Если равно 0, currency_symbol появляется после отрицательного денежного значения. |
| 16 | n_sep_by_space Если равно 1, пробел используется для разделения currency_symbol и отрицательного денежного значения. Если равно 0, пробел не используется между currency_symbol и отрицательным денежным значением. |
| 17 | p_sign_posn Указывает положение положительного знака в положительных денежных значениях. |
| 18 | n_sign_posn Указывает положение отрицательного знака в отрицательных денежных значениях. |
Следующие значения используются дляp_sign_posnиn_sign_posn:
| Значение | Описание |
|---|---|
| 0 | Круглые скобки, заключающие значение и currency_symbol. |
| 1 | Символ, размещаемый перед значением и currency_symbol. |
| 2 | Символ, размещаемый после значения и currency_symbol. |
| 3 | Символ, размещаемый непосредственно перед значением и currency_symbol. |
| 4 | Символ, размещаемый непосредственно после значения и currency_symbol. |