Фон
Стандарт C99, раздел 7.11, описывает заголовок <locale.h>
и его содержимое. В частности, он определяет struct lconv
и говорит, что:
[...] В локали "C" члены должны иметь значения, указанные в комментариях.
char *decimal_point; // "." char *thousands_sep; // "" char *grouping; // "" char *mon_decimal_point; // "" char *mon_thousands_sep; // "" char *mon_grouping; // "" char *positive_sign; // "" char *negative_sign; // "" char *currency_symbol; // "" char frac_digits; // CHAR_MAX char p_cs_precedes; // CHAR_MAX char n_cs_precedes; // CHAR_MAX char p_sep_by_space; // CHAR_MAX char n_sep_by_space; // CHAR_MAX char p_sign_posn; // CHAR_MAX char n_sign_posn; // CHAR_MAX char *int_curr_symbol; // "" char int_frac_digits; // CHAR_MAX char int_p_cs_precedes; // CHAR_MAX char int_n_cs_precedes; // CHAR_MAX char int_p_sep_by_space; // CHAR_MAX char int_n_sep_by_space; // CHAR_MAX char int_p_sign_posn; // CHAR_MAX char int_n_sign_posn; // CHAR_MAX
Раздел 7.11.2.1 "Функция localeconv()" продолжает:
Элементы структуры с типом
char *
являются указателями на строки, любые из которых (кромеdecimal_point
) может указывать на""
, чтобы указать, что это значение недоступно в текущая локаль или имеет нулевую длину. [...] Элементы с типом char являются неотрицательные числа, любые из которых могут бытьCHAR_MAX
, чтобы указать, что это значение не доступный в текущем регионе.
Далее обсуждается каждый из членов. Вы можете видеть 4 группы из 3 членов, одна представительская группа - p_cs_precedes
, p_sep_by_space
и p_sign_posn
.
char p_cs_precedes
Установите значение 1 или 0, если значению currency_symbol предшествует или преуспевает значение для неотрицательной локально отформатированной денежной величины.
char p_sep_by_space
Установите значение, указывающее на разделение currency_symbol, знаковая строка, а также значение для неотрицательного формата, количество.
char p_sign_posn
Установите значение, указывающее позиционирование позитивного_сигнала для неотрицательное локально отформатированное денежное количество.
Даны детали интерпретации p_sign_posn
; они не являются существенными для этого вопроса.
В стандарте также приводятся некоторые примеры того, как интерпретировать эти типы.
Если вы обнаружите, что исходный стандарт C99 (ISO/IEC 9899: 1999) должен знать, что как TC1 (международный стандарт ISO/IEC 9899: 1999 Technical Corrigendum 1, опубликованный 2001-09-01), так и TC2 (международный стандарт ISO/IEC 9899: 1999 Техническое исправление 2, опубликованное в 2004-11-15 гг.) Вносит изменения в п. 7.11.2.1 (но TC3 - нет). Однако изменения не затрагивают и не влияют на ответы на вопросы, которые я собираюсь задать.
Вопросы
Мои первые два вопроса касаются четырех троек (cs_precedes, sep_by_space и sign_posn), а остальные более общие вопросы о том, что представляет собой действующий язык:
- Возможно ли иметь один или два члена тройки с обозначением CHAR_MAX, в то время как другие члены имеют значения в нормальном диапазоне (0-1, 0-1, 0-4)?
-
Если разумно, как следует интерпретировать комбинации?
Определены две комбинации (все значения, установленные на
CHAR_MAX
, как в локали"C"
и все установленные значения); это другие 6 гибридных настроек, которые мне интересны. -
Правильно ли сформирована локаль, если определены трижды, но соответствующий символ валюты не является?
- Правильно ли сформирован языковой стандарт, если денежная десятичная точка не определена, но обозначен символ валюты.
- Если позиция знака не равна 0 (указывает на то, что значение окружено круглыми скобками), правильно ли сформирована локаль, если символ валюты установлен, но как положительные, так и отрицательные знаковые строки пусты?
- Имеет ли смысл определить положительную тройку, когда отрицательная тройка не является?
Моя склонность отвечать:
- Нет; либо все или ни один из членов тройки должен быть установлен в CHAR_MAX.
- Не применимо, учитывая ответ на (1).
- Нет.
- Нет (но есть пограничный случай для старой итальянской валюты (лиры), где не было фракций, и поэтому не требовалось десятичной точки, с которой можно было бы справиться с условием, что денежная десятичная точка нужна только в том случае, если
frac_digits
илиint_frac_digits
больше нуля). - Нет.
- Нет.
Затем реализация может принудительно применять эти правила, но вполне возможно, что другая реализация будет интерпретировать правила по-разному и прийти к другому выводу.
Что ты говоришь?