Форматирование чисел и дежежных единиц
Дальше: Сравнение символьных строк Вверх: Интернационализация Назад: Установка или изменение locale
Форматирование чисел и дежежных единиц
В том случае, если вы хотите отформатировать обыкновенное число или число, обозначающее сумму денег, в соответствии с текущим locale, вы можете использовать функцию localeconv для получения данных о том, как это следует делать. Для использования этой функции необходимо использовать заголовочный файл locale.h. Функция localeconv определена следующим образом:
extern struct lconv *localeconv (void);
Корректное использование функции localeconv предполагает выполнение следующих соглашений:
- Явная модификация содержимого структуры, указатель на которую возвращен, не допускается;
- Структура, указатель на которую возвращается, может быть перезаписана последующими вызовами функций localeconv и setlocale, но никакая другая библиотечная функция не оказывает влияния на ее значение;
- Если поле структуры имеет тип char и значение CHAR_MAX (CHAR_MAX -- макрос (специфицирующий максимальное значение типа char), так что не забывайте подключить заголовочный файл limits.h), то текущее locale не специфицирует значение данного параметра.
- char *decimal_point и char *mon_decimal_point -- разделители целой и дробной части числа (``десятичная точка'') при форматировании соответственно числовых и денежных единиц. В locale по умолчанию поля равны ``.'' и ``'' соответственно. В русском locale имеют значения ``,'' и ``.''.
- char *thousands_sep и char *mon_thousand_sep -- разделители групп чисел слева от десятичной точки (разделители разрядов) при форматировании соответственно числовых и денежных единиц. В locale по умолчанию оба поля равны ``''. В русском locale имеют значения ``.'' и ``'' соответственно.
- char *grouping и char *mon_grouping -- определяют механизм группировки цифр слева от десятичной точки соответственно для числовых и денежных единиц. Каждая строка представляет собой последовательность десятичных чисел, разделямых запятыми. Каждое число (слева направо) определяет длину соответствующей группы чисел (справа налево, начиная с десятичной точки). Последнее число в строке используется для разделения всех остальных групп. Если же оно равно -1, то все остальные цифры не группируются. В стандартном locale по умолчанию оба поля имеют значение ``'', означающее отмену группировки цифр. В русских - то же самое, т.е. цифры не группируются.
- char int_frac_digits и char frac_digits обозначают количество цифр дробной части числа при форматировании денежных единиц в интернациональном и национальном форматах соответственно. Часто имеют одинаковое значение. В locale по умолчанию не специфицированы, в русском же locale оба поля имеют значение 2.
Для использования знаков, обозначающих национальную валюту, используются следующие соглашения (необходимо помнить, что в США знак доллара используется традиционно очень широко, поэтому неудивительно, что стандарт ISO отдельно оговаривает такие возможности). Для каждой страны имеется два символа, обозначающих национальную валюту. ``Локальный'' служит для обозначения валюты внутри страны, ``международный'' же используется в тех ситуациях, когда необходимо избежать двусмысленностей в отношении стран -- например, долларом называются денежные единицы многих стран, но в конкретном случае речь может идти о канадских или австралийских долларах. Следующие поля структуры lconv используются для описания особенностей представления знаков национальных валют:
- char *currency_symbol -- ``локальный'' символ, обозначающий денежную единицу. В стандартном locale имеет значение ``'', в русском же locale равен ``руб''.
- char *int_curr_symbol -- ``интернациональный'' символ, обозначающий денежную единицу. В соответствии со стандартом ISO 4217 ``Коды обозначения денежных единиц'' представляет собой трехсимвольную аббревиатуру, завершаемую односимвольным разделителем, обычно пробелом. В стандартном locale равен ``''. В русском имеет значение ``RUR ''.
- char p_cs_precedes и char n_cs_precedes равны 1, если символ, обозначающий денежную единицу, должен предшествовать числовой величине, и 0, если наоборот. Значение char p_cs_precedes используется, если денежная сумма больше или равна 0, а char n_cs_precedes -- если сумма меньше 0 соответственно. В стандартном locale имеют значения CHAR_MAX, т.е. не специфицированы. В русском же оба поля имеют значения, равные 0.
- char p_sep_by_space и char n_sep_by_space равны 1, если между символом национальной валюты дожен быть напечатан пробел, и 0, если нет. Значение char p_sep_by_space используется в случае, если денежная сумма больше или равна 0, а char n_sep_by_space -- если сумма меньше 0. В стандартном locale не специфицированы, в русском же locale оба поля имеют значение 1.
- char *positive_sign и char *negative_sign -- строки, используемые для указания на то, что обозначаемая денежная сумма является положительной (или нулевой) или отрицательной соответственно. В стандартном locale имеют значения ``'', в русском же имеют значения ``'' и ``-''.
- char p_sign_posn, char n_sign_posn - числа, описывающие расположение знака для
положительных и отрицательных дежежных величин соответственно. Возможны следующие значения,
соответственно указывающие, что:
- 0: символ валюты и денежная сумма должны быть взяты в скобки;
- 1: знак печатается перед количеством и знаком валюты;
- 2: знак печатается после количества и знака валюты;
- 3: Знак печатается перед знаком валюты;
- 3: Знак печатается после знака валюты;
Dmitry A. Antipov
1999-05-26