Feedback

Create Nice File Size

Sprache: VB

Sometimes you need to display a "nice file size" – values like 14865343435 Bytes are absolut useless for Userfriendly Interfaces… Here are 3 possible Functions doing their job ;-)
'Variant one (original)
'call with MakeNiceSize(YourSizeInBytes, "0")
Public suffix() As String = {"B", "KB", "MB", "GB", "TB", "PB", "EB"}
Function MakeNiceSize(ByVal size As Double, ByVal run As Integer)
        Dim ReturnedString As String = ""

        If size >= 1024 Then
            ReturnedString = MakeNiceSize(size / 1024, run + 1)
        Else
            ReturnedString = Math.Round(size, 2).ToString("00.00") & " " & suffix(run)
        End If

        Return ReturnedString
    End Function

'Variante 2 (using loop)
    'call with MakeNiceSize(YourSizeInBytes)
    Function MakeNiceSize(ByVal size As Double)
        Dim suffix() As String = {"B", "KB", "MB", "GB", "TB", "PB", "EB"}
        Dim run As Integer = 0

        While size >= 1024
            size /= 1024
            run += 1
        End While

        Return Math.Round(size, 2).ToString("00.00") & " " & suffix(run)
    End Function

'variante 3 (possibility to "choose" size)
'modes are: "auto" (chooses best),"B","KB","MB","GB","TB","PB","EB"
'for auto simple use MakeNiceSize(YourSizeInBytes)
'for MB simple use MakeNiceSize(YourSizeInBytes,"MB")
'returns false if any error occured
Function MakeNiceSize(ByVal size As Double, optional ByVal mode As String = "auto")
        Dim suffix() As String = {"B", "KB", "MB", "GB", "TB", "PB", "EB"}
        Dim run As Integer = 0

        If mode = "auto" Then
            While size >= 1024
                size = size / 1024
                run = run + 1
            End While
            Return Math.Round(size, 2).ToString("00.00") & " " & suffix(run)
        ElseIf mode <> "auto" Then
            If suffix.Contains(mode) Then
                While suffix(run) <> mode
                    size = size / 1024
                    run = run + 1
                End While
            Else
                Return False
            End If
            Return Math.Round(size, 2).ToString("00.00") & " " & suffix(run)
        End If

        Return False
    End Function
'Variant one (original)
'call with MakeNiceSize(YourSizeInBytes, "0")
Public suffix() As String = {"B", "KB", "MB", "GB", "TB", "PB", "EB"}
Function MakeNiceSize(ByVal size As Double, ByVal run As Integer)
        Dim ReturnedString As String = ""

        If size >= 1024 Then
            ReturnedString = MakeNiceSize(size / 1024, run + 1)
        Else
            ReturnedString = Math.Round(size, 2).ToString("00.00") & " " & suffix(run)
        End If

        Return ReturnedString
    End Function

'Variante 2 (using loop)
    'call with MakeNiceSize(YourSizeInBytes)
    Function MakeNiceSize(ByVal size As Double)
        Dim suffix() As String = {"B", "KB", "MB", "GB", "TB", "PB", "EB"}
        Dim run As Integer = 0

        While size >= 1024
            size /= 1024
            run += 1
        End While

        Return Math.Round(size, 2).ToString("00.00") & " " & suffix(run)
    End Function

'variante 3 (possibility to "choose" size)
'modes are: "auto" (chooses best),"B","KB","MB","GB","TB","PB","EB"
'for auto simple use MakeNiceSize(YourSizeInBytes)
'for MB simple use MakeNiceSize(YourSizeInBytes,"MB")
'returns false if any error occured
Function MakeNiceSize(ByVal size As Double, optional ByVal mode As String = "auto")
        Dim suffix() As String = {"B", "KB", "MB", "GB", "TB", "PB", "EB"}
        Dim run As Integer = 0

        If mode = "auto" Then
            While size >= 1024
                size = size / 1024
                run = run + 1
            End While
            Return Math.Round(size, 2).ToString("00.00") & " " & suffix(run)
        ElseIf mode <> "auto" Then
            If suffix.Contains(mode) Then
                While suffix(run) <> mode
                    size = size / 1024
                    run = run + 1
                End While
            Else
                Return False
            End If
            Return Math.Round(size, 2).ToString("00.00") & " " & suffix(run)
        End If

        Return False
    End Function

5 Kommentare

  1. Der HAMER! Ich hab dafür auch was gemacht, aber mit einer mehr schlecht als recht select case…..
    ECHT GENIAL

    Thats HEAVY! I have made something for that too, but with an more bad than right select case…
    REALLY GENIUS

  2. kleiner Vorschlag: die size als Long, da das Framework auch ein Long zurückgibt und statt rekursiv vielleicht eine Schleife

    [code]
    Public Function MakeNiceSize(ByVal size As Long) As String
    Dim suffix() As String = {„B“, „KB“, „MB“, „GB“, „TB“, „PB“, „EB“}
    Dim run As Integer = 0
    Dim fdSize As Double = size
    Do While (fdSize >= 1024)
    fdSize /= 1024
    run += 1
    Loop
    Return fdSize.ToString(„0.00″) & “ “ & suffix(run)
    End Function
    [/code]

  3. @dirkb

    Danke für deinen Vorschlag, aber gegen „Rekursion“ ist nichts einzuwenden.

    Long fällt in meinem fall weg, denn:

    step 1: 564845235 bytes
    step 2: 564845235 / 1024 = 551606,6748046875 (Du siehst, ein „long“ würde fehler machen), daher fiel meine entscheidung auf double.

    @General: So ein Feedback hört man gerne, thx! 😀

    dognose

  4. Die Schleifenvariante finde ich auch besser, sorry. Meine Begründung: Es ist nicht best practice weil der Nutzer dieser Methode beim Aufruf die Rekursionsstufe mit angeben muß. Diese wird aber nur für interne Zwecke gebraucht. Was nur intern gebraucht wird, sollte nach aussen hin versteckt werden.

  5. Ja, das ist wohl der „Beste“ Grund es anders zu machen. Natürlich
    könnte ich die stufe als „optional=0“ definieren (dann wäre der Vorteil wiederrum, dass man nicht zwangsweise nur „B“ als Startstufe hat.

    Habe das CodeSnippet mal „erweitert“

    danke für eure Hinweise.