Стандартная библиотека 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, перечислены ниже:

Порядковый номерФункции и описание
1char *setlocale(int category, const char *locale)
Устанавливает или считывает информацию о локализации.
2struct lconv *localeconv(void)
Устанавливает или считывает информацию о локализации.
3locale_t newlocale(int category_mask, const char *locale, locale_t base)
Создаёт новый объект локализации.
4freelocale(locale_t locale)
Освобождает объект локализации.
5locale_t uselocale(locale_t newloc)
Устанавливает или запрашивает объект локализации потока.

Пример

Установка и запрос информации о локализации:

Пример

#include <stdio.h>
#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 <stdio.h>
#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 <stdio.h>
#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.
Другие расширения