Высокоуровневое числовое и денежное форматирование: и — КиберПедия 

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

Высокоуровневое числовое и денежное форматирование: и

2021-01-29 68
Высокоуровневое числовое и денежное форматирование: и 0.00 из 5.00 0 оценок
Заказать работу

 

После рассмотрения всех полей вы можете поинтересоваться: «Нужно ли мне на самом деле выяснять, как использовать все эти сведения, просто для форматирования денежного значения?» К счастью, ответом является «нет».[140] Функция делает за вас всю работу:

 

Эта функция во многом подобна (см. раздел 6.1.3.2 «Сложное форматирование времени:»), используя для копирования символов букв и форматированных числовых значений в, помещая в нее не более max символов. Следующая простая программа,, демонстрирует работу:

 

 

При запуске в двух различных локалях она выдает такой результат:

LC_ALL=en_US ch13‑strfmon

 

LC_ALL=it_IT ch13‑strfmon

 

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

Вывести национальное (т.е. местное) представление значения валюты.

Вывести международное представление значения валюты.

Вывести символ ''.

Форматируемые значения должны иметь тип. Разницу между и мы видим в локали "": использует символ, тогда как использует USD, которая означает «доллары США».

Гибкость – и соответственно определенная сложность – сопровождают многие функции API, разработанные для POSIX, и не является исключением. Как и с, несколько необязательных элементов, которые могут быть между и или, обеспечивают повышенный контроль. Полные формы следующие:

флаги ширина поля точность_слева точность_справа

флаги ширина поля точность_слева точность_справа

 

Флаги перечислены в табл. 13.2.

 

Таблица 13.2. Флаги для

 

 Флаг Значение
  Использовать символ с в качестве символа числового заполнения слева. Символом по умолчанию является пробел. Обычной альтернативой является 0
  Запретить использование символа группировки (например, запятой в Соединенных Штатах)
  Отрицательные значения заключать в скобки. Несовместим с флагом
  Обрабатывать положительные/отрицательные значения обычным образом. Использовать положительные и отрицательные знаки локали. Несовместим с флагом
  Не включать символ валюты. Этот флаг полезен, если вы хотите использовать для более гибкого форматирования обычных чисел, чем это предусматривает
  Выровнять результат слева. По умолчанию используется выравнивание справа. Этот флаг не действует без указания ширины поля

Ширина поля является строкой десятичных цифр, представляющих минимальную ширину. По умолчанию использует столько символов, сколько необходимо, основываясь на оставшейся части спецификации. Значения, меньшие ширины поля, дополняются пробелами слева (или справа, если указан флаг '').

Точность слева состоит из символа и строки десятичных цифр. Она указывает минимальное число цифр, которые должны быть слева от десятичного символа‑разделителя дробной части[141]; если преобразованное значение меньше этого, результат выравнивается символом числового заполнения. По умолчанию используется пробел, однако для его изменения можно использовать флаг. Символы группировки не включаются в общий счет.

Наконец, точность справа состоит из символа '' и строки десятичных цифр. Она указывает, с каким числом значащих цифр округлить значение до форматирования. По умолчанию используются поля и в. Если это значение равно 0, десятичная точка не выводится.

 возвращает число символов, помещенных в буфер, не включая завершающий нулевой байт. Если недостаточно места, функция возвращает ‑1 и устанавливает в.

Помимо, POSIX (но не ISO С) предусматривает специальный флаг – символ одинарной кавычки, – для форматов,,,,, и. В локалях, имеющих разделитель тысяч, этот флаг добавляет и его. Следующая простая программа,, демонстрирует вывод:

 

Вот что происходит для двух различных локалей: в одной есть разделитель тысяч, в другой нет:

LC_ALL=C ch13‑quoteflag

 

LC_ALL=en_US ch13‑quoteflag

 

На время написания лишь GNU/Linux и Solaris поддерживают флаг. Дважды проверьте справочную страницу printf (3) на своей системе.

 

Пример: форматирование числовых значений в

 

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

 

 

(Номера строк даны относительно начала фрагмента.) Некоторые части кода, не имеющие отношения к обсуждению, были опущены, чтобы облегчить фокусировку на важных частях.

Переменная, используемая в строках 13–17, представляет. Она инициализируется в. Здесь для нас интерес представляет, который является символом разделителя тысяч, и, который является массивом, описывающим число цифр между разделителями. Нулевой элемент означает «использовать для всех последующих цифр значение предыдущего элемента», а значение означает «прекратить вставку разделителей тысяч».

С таким введением, давайте посмотрим на код. Строка 7 устанавливает, которая является беззнаковой версией форматируемого значения. и отслеживают положение в и число цифр в текущей группе, которые были преобразованы, соответственно[142]. равен true, когда в спецификации преобразования был отмечен символ.

Цикл генерирует символы цифр в обратном порядке, заполняя буфер с конца к началу. Каждая цифра создается в строке 11. Затем строка 25 делится на 10 путем смещения значения вправо на одну десятичную цифру.

Нас интересуют строки 12–24. Эта работа осуществляется только на системе, поддерживающей локали, на что указывает наличие заголовочного файла. Именованная константа в такой системе будет равна true[143].

Когда условие в строке 13 истинно, настало время добавить символ разделителя тысяч. Это условие можно прочесть как «если требуется группировка и текущее положение в указывает нужное для группировки количество и текущее число цифр равно группируемому количеству». Если это условие истинно, строка 14 добавляет символ разделителя тысяч. Комментарий обращает внимание на предположение, которое, вероятно, истинно, но которое может вновь появиться позже. ('XXX' является традиционным способом выделения опасного или сомнительного кода. Его легко отыскать, и он весьма заметен для читателя кода.)

После использования текущего положения в строки 15–22 заглядывают в значение в следующем положении. Если это 0, продолжает использоваться значение текущего положения. Мы указываем на это, восстанавливая 0 в (строка 16). С другой стороны, если в следующем положении, группировка должна быть прекращена, и строка 18 убирает ее, устанавливая в false. В противном случае, следующее значение является значением группировки, поэтому строка 20 восстанавливает 0 в, а строка 21 увеличивает значение.

Это низкоуровневый, подробный код. Однако, поняв один раз, как представляется информация в, код читать просто (и его было просто писать).

 


Поделиться с друзьями:

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.01 с.