На этом шаге мы рассмотрим определение различных способов представления чисел.
Фацет numpunct определяет символ, используемый в качестве десятичной точки, управляет вставкой необязательных разделителей групп разрядов, а также задает текстовые представления логических значений. Функции фацета numpunct перечислены в таблице 1.
Выражение | Описание |
---|---|
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 приведены примеры разного форматирования одного числа.
Строка | Результат |
---|---|
{ 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.
На следующем шаге мы рассмотрим форматирование.