Програмиране на C/Стандартна библиотека/locale.h

От Уикикниги
Направо към навигацията Направо към търсенето

Заглавния файл <locale.h> декларира две функции setlocale() и localeconv(), структурен тип lconv, макрос NULL за нулева указателна константа, и макроси, чиито имена започват с LC_ за категориите информация в един регион. Подпомага създаването на програми на C, които са в състояние да се адаптират към местните културни конвенции. Например програмите могат да използват специфични набори от знаци или формати за валутна информация валидни в определени региони.[1].

Макроси[редактиране]

Функцията setlocale() позволява да запитвате или да задавате текущия регион. Информацията в региона е разделена на категории, които можете да запитвате и настройвате индивидуално. Следните целочислени макроси са определени за обозначаване на тези категории информация:

Макрос Предназначение
NULL Дефинира константен нулев указател.
Следващите макроси се използват като първи аргумент на функцията setlocale():
LC_ALL Всички категории.
lLC_COLLATE Влияе на поведението на strcoll() и strxfrm() функциите.
LC_CTYPE Влия на поведението на всички функции за обработка на символи (и многобайтови символи), с изключение на isdigit() и isxdigit().
LC_MONETARY Влияе на паричната информация осигурявана от localeconv() функцията.
LC_NUMERIC Влияе на форматиращата информацията за не парични стойности осигурявана от localeconv() функцията.
LC_TIME Влияе на поведението на strftime() функцията.

Тези макроси се разширяват до целочислени константни изрази с различни стойности. Имплементациите са свободни да дефинират допълнителни макроси, започващи с LC_ следвани от главна буква.

Макро-функции[редактиране]

C2x § 7.11 Localization <locale.h>[1]

setlocale[редактиране]

C2x § 7.11.1 Locale control[2]

Прототип Предназначение
#include <locale.h>
char *setlocale(int category, const char *locale);
Функцията setlocale позволява да адаптирате програмата към местните условия на даден регион като час и дата, символи за десетична точка и валута, и други конвенции. Функцията връща указател към низ, който идентифицира новият регион, или текущия регион, ако се подаде нулев указател като втори аргумент[3].

Конвенциите на един регион са разделени на категории. Тези категории са описани в по-горе и се използват като първи аргумент на функцията.

Вторият параметър locale е указател към низ, който указва региона. С89 дефинира две стандартни стойности за този параметър:

"C" – Специфицира минималната среда за компилиране на С програми.
" " – Специфицира имплементационно-зависима местна среда за компилиране на С програми.

Имплементациите могат да дефинират свои низове като аргумент на locale.

При стартиране на програмата регионалните настройките съответстват на тези, зададени c setlocale (LC_ALL, "C");.

Израза от вида setlocale(category, locale) връща като резултат указател към низ, описващ новите регионални настройки. Ако зададените настройки не могат да се изпълнят, функцията връща NULL.

localeconv[редактиране]

C2x § 7.11.2 Numeric formatting convention inquiry[4]

Прототип Предназначение
#include <locale.h>
struct lconv *localeconv(void);
Функцията localeconv връща указател към структура lconv, която съдържа информация за регионалните настройки, свързани с начина по който числата се форматират. Членовете на структурата и тяхното значение са описани по-горе. Те не трябва да се променят ръчно от програмата[5].

Членовете на структурата тип char * са указатели към низ, всеки от който (освен decimal_point) може да сочи към празен низ " ", което означава, че стойността не е налична в текущия регион или е с нулева дължина. Членовете тип char са не отрицателни числа, всяко от които може да бъде CHAR_MAX, което означава, че стойността не е налична в текущия регион.

Членове[редактиране]

Член Предназначение
char *decimal_point; // "." Символ за десетична точка, използван за не парични стойности. В подразбиращата се локализация този указател сочи към ".".
char *thousands_sep; // "" Символ за разделител на хилядните, използван за не парични стойности.
char *grouping; // "" Указател към char-масив, чийто елементи указват размера на всяка група цифри в не парични единици.
Всеки символ представлява цяло число, което обозначава броят на цифрите в текущата група.
Числовият символ в първият елемент на масива, указва броят на цифрите в най-дясната група и т.н.
Стойност '0' означава, че предходната стойност ще се използва за останалите групи.
Например ако масивът се състои от символите {'3', '0'}, това означава, че всички цифри са групирани по три.
char *mon_decimal_point; // "" Символ за десетична точка, използван в парични стойности.
char *mon_thousands_sep; // "" Символ за разделител на хилядните, използван за парични стойности.
char *mon_grouping; // "" Указател към char-масив, чийто елементи указват размера на всяка група цифри в парични единици.
Всеки символ представлява цяло число, което обозначава броят на цифрите в текущата група.
Числовият символ в първият елемент на масива, указва броят на цифрите в най-дясната група и т.н.
Стойност '0' означава, че предходната стойност ще се използва за останалите групи.
Например ако масивът се състои от символите {'3', '0'}, това означава, че всички цифри са групирани по три.
char *positive_sign; // "" Знака използван за указване на положителни парични стойности.
char *negative_sign; // "" Знака използван за указване на отрицателни парични стойности.
char *currency_symbol; // "" Указател към международен валутен символ, използван за местна валута.
char frac_digits; // CHAR_MAX Указва броят цифрите след десетичната точка, които да бъдат показани в парични стойности.
char p_cs_precedes; // CHAR_MAX Ако е 1, currency_symbol се появява пред положителна парична стойност. Ако е 0 currency_symbol се появява след положителна парична стойност.
char n_cs_precedes; // CHAR_MAX Ако е 1, currency_symbol се появява пред отрицателна парична стойност. Ако е 0, currency_symbol се появява след отрицателна парична стойност.
char p_sep_by_space; // CHAR_MAX Ако е 1, currency_symbol е разделен с интервал от положителна парична стойност. Ако е 0, currency_symbol не е разделен с интервал от положителна парична стойност.
char n_sep_by_space; // CHAR_MAX Ако е 1, currency_symbol е разделен с интервал от отрицателна парична стойност. Ако е 0, currency_symbol не е разделен с интервал от отрицателна парична стойност.
char p_sign_posn; // CHAR_MAX
char n_sign_posn; // CHAR_MAX Указват позицията на положителния и отрицателния знак съответно. Следните стойности са валидни:
  • 0 - Числото и currency_symbol са затворени заедно в скоби.
  • 1 - Знаковият низ се поставя пред числото и currency_symbol.
  • 2 - Знаковият низ се поставя след числото и currency_symbol.
  • 3 - Знаковият низ се поставя непосредствено пред currency_symbol.
  • 4 - Знаковият низ се поставя непосредствено след currency_symbol.
char *int_curr_symbol; // "" Низ от символи, използвани за международна валута. Първите три символи са специфицирани от ISO 4217:1987, а четвъртият е символа, който отделя символа за валута от паричните единици.
char int_frac_digits; // CHAR_MAX Указва броят цифрите след десетичната точка, които да бъдат показани в международни парични стойности.

Бележки[редактиране]

  1. 1,0 1,1 Script error: The module returned a nil value. It is supposed to return an export table.. ISO/IEC JTC1/SC22/WG14. p. 186, § 7.11 Localization <locale.h>. (на английски)
  2. "ISO/IEC 9899:202x" с. 186 § 7.11 Locale control
  3. "ISO/IEC 9899:202x" с. 186 § 7.11.1 The setlocale function
  4. "ISO/IEC 9899:202x" с. 186 § 7.11.1 Numeric formatting convention inquiry
  5. "ISO/IEC 9899:202x" с. 187 § 7.11.2 The localeconv function