Отображение чисел с использованием композитного форматирования – Hey, Scripting Guy! Blog

Резюме: 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

Оригинал:

http://blogs.technet.com/b/heyscriptingguy/archive/2013/03/13/use-powershell-and-conditional-formatting-to-format-numbers.aspx


Страницы в социальных сетях:

Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell


Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s