Резюме: Microsoft Scripting Guy, Ed Wilson рассказывает о применении композитного форматирования для отображения чисел.
Заметка: Это третья статья в серии постов о методах и операторах форматирования в Windows PowerShell. Первая статья, Основы форматирования в PowerShell, рассказывает о вариантах применения статического метода Format класса String и оператора Windows PowerShell –f с использованием возможностей композитного форматирования. Во второй статье, Отображение строк с использованием композитного форматирования, рассматривается применение определителей формата для задания различных вариантов отображения строк.
Знакомимся с определителями числовых форматов
Мне довольно часто приходится представлять числовую информацию в различных форматах. К счастью, мне не приходится заново изобретать колесо, вместо этого я могу воспользоваться определителями стандартных числовых форматов, документация по которым доступна на сайте MSDN. Используя эти определители, я могу представить число, например, в одном из следующих форматов.
Currency “C” | Decimal “D” |
Exponential “E” | Fixed-Point “F” |
General “G” | Number “N” |
Percent “P” | Hexadecimal “H” |
Заметка: Для получения более полной информации об использовании композитного форматирования ознакомьтесь со статьей Composite Formatting на MSDN. Более детальное описание определителей стандартных числовых форматов вы можете найти в статье Standard Numeric Format Strings.
Представляем число в процентном формате
Конвертирование числа в процентный формат обычно состоит из умножения числа на 100 и добавления символа процента.
Заметка: Пример подобного подхода с использованием определителя числового формата “N” вы можете найти в посте Weekend Scripter: The Scripting Wife Talks about the First Warm-Up Event in the Winter Scripting Games.
Предположим, что мне нужно поделить число 5 на число 21 и представить результат в виде процентного соотношения. При использовании обычного подхода, это выглядело бы следующим образом.
PS C:\> (5/21)*100
23.8095238095238
Проблема в том, что результат содержит слишком большое количество десятичных знаков. Я могу воспользоваться приемом, который использовала Scripting Wife в вышеприведенной статье – использовать определитель формата “N”.
PS C:\> «{0:N2}» -f ((5/21)*100)
23.81
Этот подход вполне применим, однако, используя определитель формата “P”, я могу уменьшить количество вычислений.
Пример 1. Выводим процентное значение в консоль
В этом примере я сохраню результат 5/21 в переменной $percernt. Если отобразить ее значение, мы получим следующее:
PS C:\> $Percent
0.238095238095238
Для того, чтобы представить это значение в процентном формате, мне не нужно умножать его на 100 и указывать определитель точности (precision specifier), чтобы результат содержал только два десятичных символа. Вместо этого я воспользуюсь возможностями композитного форматирования. В элементе форматирования я укажу индекс объекта, а затем – определитель процентного формата. В итоге я получу число, уже умноженное на 100 и содержащее два десятичных символа.
PS C:\> $Percent = 5/21
PS C:\> [console]::WriteLine(«{0:P}»,$percent)
23.81 %
Пример 2. Используем метод ToString
В Windows PowerShell все является объектом – даже число. Это значит, что обычное целое число обладает свойствами и методами. Один из наиболее используемых (по крайней мере, мной) – это метод ToString. Я иногда использую его, например, в таких случаях, когда мне нужно записать числовое значение в реестр. Что мне особенно нравится в этом методе, так это то, что один из вариантов его использования позволяет указать определитель формата.
Пример 2A. Сохраняем значение в переменной и вызываем метод
В этом примере я выполню необходимые вычисления и сохраню результат в переменной $percent. Я укажу эту переменную в качестве параметра метода WriteLine, где вызову метод ToString, указав определитель формата “P”. Преимущество этого подхода заключается в том, что вам не требуется использовать композитное форматирование, вместо этого вы просто вызываете метод ToString.
PS C:\> $Percent = 5/21
PS C:\> [console]::WriteLine(($percent).ToString(«P»))
23.81 %
Пример 2B. Вычисляем значение в строке вызова метода
В этом примере я вычисляю значение прямо в строке вызова метода. Это позволяет мне представить код в виде одной команды, без использования внешних переменных.
PS C:\> [console]::WriteLine((5/21).ToString(«P»))
23.81 %
Пример 3. Используем оператор форматирования Windows PowerShell
Наиболее лаконичная форма использования определителя процентного формата – это использование оператора форматирования Windows PowerShell (-f). Как я говорил в предыдущей статье, как только вы разберетесь с его синтаксисом, вам понравится простота его использования.
Пример 3A. Сохраняем результат в переменной и вызываем оператор
В этом примере я сохраняю результат вычисления в переменной $percent. Затем я использую возможности композитного форматирования – в элементе форматирования я указываю индекс объекта (0) и определитель формата (“P”). Справа от оператора –f я указываю переменную $percent, содержимое которой замещает элемент форматирования.
PS C:\> $Percent = 5/21
PS C:\> «{0:P}» -f $Percent
23.81 %
Пример 3B. Вычисляем значение в процессе использования оператора
В этом примере я не использую промежуточную переменную, а вычисляю значение прямо в процессе использования оператора форматирования.
PS C:\> «{0:P}» -f (5/21)
23.81 %
Пример 4. Отображаем больше (или меньше), чем два десятичных символа
В используемом мной элементе форматирования (“{0:P}”) я могу указать определитель точности справа от определителя формата “P”. Я могу задать, чтобы результат содержал три десятичных символа, один, или столько, сколько мне нужно.
PS C:\> «{0:P3}» -f (5/21)
23.810 %
Пример 5. Вычисляем процентное соотношение с использованием административных констант
Административные константы (KB, MB, GB) облегчают работу с числовыми значениями. Например, следующая команда возвращает основную информацию о процессе Explorer на моем компьютере.
PS C:\> Get-Process explorer
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
——- —— —— —— —— —— — ————
1818 96 47684 113708 623 18.21 1328 explorer
Мы видим, что процесс использует 623 мегабайта виртуальной памяти. Это много или мало? Для того, чтобы это выяснить, я сравню это значение с количеством системной памяти моего ноутбука – 16 гигабайт. Однако, я не хочу углубляться в математические вычисления. Ничего страшного, определитель формата вполне может разобраться с этим самостоятельно.
PS C:\> «{0:P}» -f (623MB/16GB)
3.80 %
Использование композитного форматирования в решении Scripting Wife
Настоящая мощь композитного форматирования, определителей формата, элементов форматирования и т.д. проявляется при использовании их с другими возможностями Windows PowerShell.
Scripting Wife написала отличную однострочную команду для получения объема использования дискового пространства в процентном соотношении. В этой команде используется несколько приемов работы с Windows PowerShell, включая композитное форматирование. (Я не уверен, что она знала, что использует именно композитное форматирование, однако она сумела адаптировать его функционал для своего решения).
Также она использовала командлет Select-Object, который позволяет создать пользовательское свойство для возвращаемого объекта. Это очень мощная вещь. Так что все, что мне нужно сделать – это скопировать ее код и заменить определитель формата “N” на “P”.
gwmi win32_volume |
ft DriveLetter, FreeSpace, Capacity,
@{Label=»PercentFree»;Expression= {«{0:P}» -f ($_.freespace / $_.capacity)}}
Автор:
Ed Wilson, Microsoft Scripting Guy
Оригинал:
Страницы в социальных сетях:
Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell