internal/Format-SpeedHumanReadable.ps1

Function Format-SpeedHumanReadable {
    Param (
        [String]$Size,

        [ValidateSet('Auto', 'PB', 'TB', 'GB', 'MB', 'KB', 'Bytes')]
        [String]$Unit = 'Auto'
    )

    [System.Double]$absSize = $size.trimStart('-')
    if ($size -like '-*') { $Operator = '-' }
    else { $Operator = '' }

    If ($Unit -eq 'Auto') {
        switch ($absSize) {
            { $_ -ge 1PB } { "{1}{0:#.#' PB'}" -f ($absSize / 1PB), $Operator; break }
            { $_ -ge 1TB } { "{1}{0:#.#' TB'}" -f ($absSize / 1TB), $Operator; break }
            { $_ -ge 1GB } { "{1}{0:#.#' GB'}" -f ($absSize / 1GB), $Operator; break }
            { $_ -ge 1MB } { "{1}{0:#.#' MB'}" -f ($absSize / 1MB), $Operator; break }
            { $_ -ge 1KB } { "{1}{0:#' KB'}" -f ($absSize / 1KB), $Operator; break }
            default { "{1}{0}" -f ($absSize), $Operator + " B" }
        }
    }
    else {
        switch ($Unit) {
            'PB'  { "{1}{0:#.#' PB'}" -f ($absSize / 1PB), $Operator; break }
            'TB'  { "{1}{0:#.#' TB'}" -f ($absSize / 1TB), $Operator; break }
            'GB'  { "{1}{0:#.#' GB'}" -f ($absSize / 1GB), $Operator; break }
            'MB'  { "{1}{0:#.#' MB'}" -f ($absSize / 1MB), $Operator; break }
            'KB'  { "{1}{0:#' KB'}" -f ($absSize / 1KB), $Operator; break }
            default { "{1}{0}" -f ($absSize), $Operator + " B" }
        }
    }
}