Форматирование чисел и дежежных единиц

Форматирование чисел и дежежных единиц [Вперед] [Вверх] [Назад] [Содержание]
Дальше: Сравнение символьных строк Вверх: Интернационализация Назад: Установка или изменение locale

Форматирование чисел и дежежных единиц

В том случае, если вы хотите отформатировать обыкновенное число или число, обозначающее сумму денег, в соответствии с текущим locale, вы можете использовать функцию localeconv для получения данных о том, как это следует делать. Для использования этой функции необходимо использовать заголовочный файл locale.h. Функция localeconv определена следующим образом:

extern struct lconv *localeconv (void);

Корректное использование функции localeconv предполагает выполнение следующих соглашений:

  • Явная модификация содержимого структуры, указатель на которую возвращен, не допускается;
  • Структура, указатель на которую возвращается, может быть перезаписана последующими вызовами функций localeconv и setlocale, но никакая другая библиотечная функция не оказывает влияния на ее значение;
  • Если поле структуры имеет тип char и значение CHAR_MAX (CHAR_MAX -- макрос (специфицирующий максимальное значение типа char), так что не забывайте подключить заголовочный файл limits.h), то текущее locale не специфицирует значение данного параметра.
Гарантируется, что структура lconv имеет по крайней мере следующие поля, которые используются для описания особенностей форматирования как обычных чисел, так и денежных единиц:
  • 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.
Следующие поля структуры lconv используются для описания особенностей постановки знака перед значениями денежных сумм:
  • char *positive_sign и char *negative_sign -- строки, используемые для указания на то, что обозначаемая денежная сумма является положительной (или нулевой) или отрицательной соответственно. В стандартном locale имеют значения ``'', в русском же имеют значения ``'' и ``-''.
  • char p_sign_posn, char n_sign_posn - числа, описывающие расположение знака для положительных и отрицательных дежежных величин соответственно. Возможны следующие значения, соответственно указывающие, что:
    • 0: символ валюты и денежная сумма должны быть взяты в скобки;
    • 1: знак печатается перед количеством и знаком валюты;
    • 2: знак печатается после количества и знака валюты;
    • 3: Знак печатается перед знаком валюты;
    • 3: Знак печатается после знака валюты;
    В locale по умолчанию не специфицированы, в русском же locale оба поля имеют значение 1.



Dmitry A. Antipov
1999-05-26