На самом деле, решил присоединиться с моим собственным ответом. Это моя процедура генерации строк для вывода размеров человека из числа байтов:
#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] );
}
Он вычисляет правильный размер, посмотрев, какой это порядок двоичной величины, используя 1024 в качестве базы (1024 байта = 1 КБ, 1024 КБ = 1 МБ и т. Д.). При этом он сжимает входное значение (используя арифметику с плавающей точкой), так что, когда оно меньше 1024, оно имеет как удобочитаемое значение, так и спецификатор величины. Затем он генерирует строку, содержащую отформатированное значение (без десятичных разрядов для байтов, 2 десятичных разряда для любой большей величины), и проверяет постоянную величины, чтобы определить, какой суффикс добавить.