Ich habe beschlossen, mich mit meiner eigenen Antwort einzuschalten. Dies ist meine Routine zur Erzeugung von Zeichenketten für die Ausgabe von menschlichen Größen aus Byte-Zahlen:
#include <math.h> // for isgreater()
static NSString * MemorySizeString( mach_vm_size_t size )
{
enum
{
kSizeIsBytes = 0,
kSizeIsKilobytes,
kSizeIsMegabytes,
kSizeIsGigabytes,
kSizeIsTerabytes,
kSizeIsPetabytes,
kSizeIsExabytes
};
int sizeType = kSizeIsBytes;
double dSize = (double) size;
while ( isgreater(dSize, 1024.0) )
{
dSize = dSize / 1024.0;
sizeType++;
}
NSMutableString * str = [[NSMutableString alloc] initWithFormat: (sizeType == kSizeIsBytes ? @"%.00f" : @"%.02f"), dSize];
switch ( sizeType )
{
default:
case kSizeIsBytes:
[str appendString: @" bytes"];
break;
case kSizeIsKilobytes:
[str appendString: @"KB"];
break;
case kSizeIsMegabytes:
[str appendString: @"MB"];
break;
case kSizeIsGigabytes:
[str appendString: @"GB"];
break;
case kSizeIsTerabytes:
[str appendString: @"TB"];
break;
case kSizeIsPetabytes:
[str appendString: @"PB"];
break;
case kSizeIsExabytes:
[str appendString: @"EB"];
break;
}
NSString * result = [str copy];
[str release];
return ( [result autorelease] );
}
Die korrekte Größe wird anhand der binären Größenordnung ermittelt, wobei 1024 als Basis verwendet wird (1024 Bytes = 1KB, 1024KB = 1MB usw.). Dabei wird der Eingabewert (mit Hilfe von Fließkomma-Arithmetik) so verkleinert, dass er, sobald er unter 1024 liegt, sowohl einen für Menschen lesbaren Wert als auch eine Größenangabe hat. Anschließend wird eine Zeichenkette erzeugt, die den formatierten Wert enthält (keine Nachkommastellen für Bytes, 2 Nachkommastellen für jede größere Größe), und die Größenkonstante wird untersucht, um festzustellen, welches Suffix angehängt werden soll.