Feedback

VB - Create Nice File Size

Veröffentlicht von am 17.06.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 ;-)


GFU-Schulungen  [Anzeige]

Visual Studio Team Foundation Server 2017/2015 (TFS) für Administratoren - Kompakt

Nach dieser Schulung beherrschen Sie die Grundlagen des TFS. Sie erledigen administrative Aufgaben schnell und sicher.

VB.NET Komplett

Sie stehen vo der Aufgabe, individuelle Anwendungen für Windows zu schreiben. Hier ist VB.NET die optimale Sprache. Sie erlernt sich recht leicht und passt sich komplett in die .NET Umgebung von Microsoft ein. Nach der Schulung entwickeln Sie anwenderfreundliche Programme in VB.NET . Mit den objektorientierten Modellen in VB.NET erzeugen Sie außerdem wiederverwendbare Komponenten.

'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 01.07.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 05.07.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 08.11.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 09.11.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 09.11.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!