Feedback

VB - Create Nice File Size

Veröffentlicht von am 6/17/2008
(4 Bewertungen)
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

5 Kommentare zum Snippet

General Bison schrieb am 7/1/2008:
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
dirkb schrieb am 7/5/2008:
kleiner Vorschlag: die size als Long, da das Framework auch ein Long zurückgibt und statt rekursiv vielleicht eine Schleife

    
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
dognose schrieb am 11/8/2008:
@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! :-D

dognose
Rainer Hilmer schrieb am 11/9/2008:
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.
dognose schrieb am 11/9/2008:
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.
 

Logge dich ein, um hier zu kommentieren!