How to convert value to KB, MB, or GB depending on digit placeholders?

powershell, ssas

Solution

Here's two more ways of formatting a size in bytes:

1) Using a switch()

function Format-Size() {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [double]$SizeInBytes
    )
    switch ([math]::Max($SizeInBytes, 0)) {
        {$_ -ge 1PB} {"{0:N2} PB" -f ($SizeInBytes / 1PB); break}
        {$_ -ge 1TB} {"{0:N2} TB" -f ($SizeInBytes / 1TB); break}
        {$_ -ge 1GB} {"{0:N2} GB" -f ($SizeInBytes / 1GB); break}
        {$_ -ge 1MB} {"{0:N2} MB" -f ($SizeInBytes / 1MB); break}
        {$_ -ge 1KB} {"{0:N2} KB" -f ($SizeInBytes / 1KB); break}
        default {"$SizeInBytes Bytes"}
    }
}

2) By performing a loop where the gives byte size is repeatedly divided by 1024

function Format-Size2 {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [double]$SizeInBytes
    )

    $units = "Bytes", "KB", "MB", "GB", "TB", "PB", "EB"
    $index = 0

    while ($SizeInBytes -gt 1024 -and $index -le $units.length) {
        $SizeInBytes /= 1024
        $index++
    }
    if ($index) {
        return '{0:N2} {1}' -f $SizeInBytes, $units[$index]
    }

    return "$SizeInBytes Bytes"
}

Problem

I have the following ``` Import-Module SqlServer $Analysis_Server = New-Object Microsoft.AnalysisServices.Server $Analysis_Server.connect("$server") $estimatedSize = $([math]::Round($($($Analysis_Server.Databases[$cube].EstimatedSize)/1024/1024),2)) ``` this generates for me the size in MB I would like to enhance this to make it more user friendly readable especially for values that are in the double digit MB for example, sometimes i get values `50.9 MB` which is good. but some other values are `37091 MB` or `3082.86 MB`, and i'd like values like that to be automatically converted to GB (`37.09 GB, 3.08 GB` respectively) if they are in the GB range. and if there are values that are not in MB range, they should be displayed in KB i.e. `0.78 MB` should just be `780 KB` how can i accomplish this?

Original source