Шаг 537.
Библиотека STL.
Интернационализация. Числовое форматирование. Оформление

    На этом шаге мы рассмотрим определение различных способов представления чисел.

    Фацет numpunct определяет символ, используемый в качестве десятичной точки, управляет вставкой необязательных разделителей групп разрядов, а также задает текстовые представления логических значений. Функции фацета numpunct перечислены в таблице 1.

Таблица 1. Функции фацета numpunct
Выражение Описание
np.decimal_point() Возвращает символ, используемый в качестве десятичной точки
np.thousands_sep() Возвращает символ разделения групп разрядов
np.grouping() Возвращает объект string с описанием позиций разделителей
np.truename() Возвращает текстовое представление значения true
np.falsename() Возвращает текстовое представление значения false

    В аргументе шаблона numpunct передается символьный тип charT. Символы, возвращаемые функциями decimal_point() и thousand_sep(), относятся к этому типу, а функции truename() и falsename() возвращают basic_string<charT>. Обязательна поддержка двух специализаций numpunct<char> и numpunct<wchar_t>.

    Поскольку числа из множества цифр плохо читаются без промежуточных разделителей, стандартные фацеты числового форматирования и лексического разбора позволяют разделять группы разрядов. Чаще всего цифры, представляющие целое число, группируются по триплетам. Например, в США один миллион записывается так:

   1,000,000

    К сожалению, такое представление используется не везде. Например, в Германии для разделения группы разрядов используется точка, поэтому немец запишет это же число в несколько ином виде:

  1.000.000

    Символ-разделитель определяется функцией thousands_sep(). Но и этого недостаточно, поскольку в некоторых странах встречаются другие правила разделения разрядов. Например, в Непале один миллион записывается в виде:

  10.00.000

    В этом случае разные группы содержат разное количество цифр. В таких случаях может пригодиться строка, возвращаемая функцией grouping(). Цифра в позиции с индексом i определяет количество разрядов в i-й группе, отсчет ведется от нуля с крайней правой группы. Если количество символов в строке меньше количества групп, размер последней заданной группы применяется повторно. Значение numeric_limits<char>::max() определяет группу неограниченного размера, а при полном отсутствии групп используется пустая строка. В таблице 2 приведены примеры разного форматирования одного числа.

Таблица 2. Примеры разделения разрядов в одном миллионе
Строка Результат
{ 0 } или "" (используется по умолчанию) 1000000
{ 3, 0 } или {\3} 1,000,000
{ 3, 2, 3, 0 } или "\3\2\3" 10,00,000
{ 2, CHAR_MAX, 0 } 10000,00

    Обратите внимание, что обычные цифры в данном случае практически бесполезны. Например, строка "2" для кодировки ASCII определяет группы в 50 цифр, потому что символу 2 в кодировке ASCII соответствует целочисленный код 50.

    На следующем шаге мы рассмотрим форматирование.




Предыдущий шаг Содержание Следующий шаг