В Windows PowerShell версии 5.1, если я создаю pscustomobject
, он отображается следующим образом:
Однако в PowerShell версии 7.3.4 в Ubuntu он отображается следующим образом:
Обратите внимание на три десятичных знака.
Я хотел бы отобразить число без десятичных знаков.
Похоже, это обходной путь:
Я хотел бы отображать значения decimal
в таблице без десятичных знаков в кросс-платформенной и кросс-версий манере.
Является ли вышеизложенное лучшим подходом?
В данном случае это в основном для отображения в консоли.
Использование вычисляемого свойства — правильный подход, но вы можете упростить его следующим образом:
[pscustomobject] @{
abc = [decimal] 12
} | Format-Table @{ Expression='abc'; FormatString='N0' }
Использование имени свойства в виде строки в качестве значения записи Expression
указывает PowerShell не только использовать значение этого свойства, но и использовать его имя в качестве имени столбца.
Label
(также известной как Name
).FormatString
позволяет указать строку формата .NET, которая применяется к тому, что оценивает запись Expression
.
N0
— это строка стандартного числового формата .NET, которая применяет форматирование чисел N
с 0
десятичными знаками.
Обратите внимание, что группировка тысяч по-прежнему применяется (например, 123000
становится 123,000
в культурах, которые используют ,
в качестве символа группировки).
Чтобы предотвратить это, используйте вместо этого G0
.
Исходная информация:
Что касается форматирования вывода таблиц по умолчанию (неявное или явное использование Format-Table ), PowerShell (Core) 7+ внес изменение в то, как числовые типы могут хранить дробные числа ([double]
, [decimal]
, и - редко используемые - [single]
) отформатированы:
В Windows PowerShell было применено форматирование .ToString()
, тогда как форматирование чисел N
теперь применяется к экземплярам указанных типов, что приводит к фиксированному количеству десятичных знаков, подразумеваемому этим форматом, и, к сожалению, количество десятичных знаков не только потенциально культура -зависит, но на самом деле также различается на разных платформах для ДАННОЙ культуры из-за использования разных библиотек локализации — см. этот комментарий к проблеме GitHub # 81853 для деталей.
Обоснование этого изменения заключалось в том, что подход Windows PowerShell .ToString()
приводил к числам, которые (а) могли сильно различаться с точки зрения используемых десятичных разрядов и (б) числа не были выровнены по десятичному знаку.
Запустите [pscustomobject] @{ Num = 1/9 }, [pscustomobject] @{ Num = 2.1 }
в сеансе Windows PowerShell, чтобы увидеть проблему.
Подробное обсуждение этого изменения см. в GitHub issue #19107, в ходе которого обсуждались два возможных улучшения:
Заставляя Format-Table -AutoSize
снова использовать .ToString()
-форматирование, но с выравниванием по десятичному знаку.
Ситуационно пропуская все 0
десятичные знаки и десятичный знак, но при этом выравнивая десятичный знак чисел, которые имеют ненулевые десятичные знаки.
Однако для этого потребуется внести изменения в саму .NET, которая, начиная с версии 7.x, не поддерживает это — подробности см. в этом комментарии к связанной проблеме GitHub.
Удивительный ответ. Спасибо! Проверено и работает хорошо в обеих версиях.
Если вам интересно, я обнаружил эту проблему, запустив этот скрипт в Ubuntu с PS 7.3.4.
Это в основном для отображения данных в вашей консоли или вы планируете экспортировать их позже?
Export-Csv
быToString
это для вас, например.