Получение первых трех цифр из int / float - PullRequest
2 голосов
/ 15 мая 2009

Я хотел бы получить первые три цифры из больших чисел с плавающей точкой или целых чисел, а в некоторых вставить десятичную. Например:

KB
----------
32589 >> 325
43266 >> 432

MB
----------
1234599 >> 1.23
3422847 >> 3.42

Для конкретного номера у меня будут строки "KB" и "MB". Это даст мне знать, если требуется десятичная дробь, как в примерах «MB». Я посмотрел на NSNumberFormatter, но не был уверен, что там поможет. Есть предложения?

Ответы [ 5 ]

7 голосов
/ 15 мая 2009

Вот некоторый быстрый и грязный код для выделения трех первых цифр номера (в формате NSString):

long someNumber = 1234599;
NSString * allDigits = [NSString stringWithFormat:@"%l", someNumber];
NSString * topDigits = [allDigits substringToIndex:3];

NSLog(@"%@", topDigits); // will output 123
6 голосов
/ 15 мая 2009

Подождите, вы пытаетесь сказать, что 32589 байт - это 325 КБ?

Не имеет ли смысла многократно делить число на 1000 до тех пор, пока результат не станет меньше 1000, а затем отформатировать в соответствии с вашим эквивалентным значением printf?

5 голосов
/ 15 мая 2009

На самом деле, решил присоединиться с моим собственным ответом. Это моя процедура генерации строк для вывода размеров человека из числа байтов:

#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 десятичных разряда для любой большей величины), и проверяет постоянную величины, чтобы определить, какой суффикс добавить.

1 голос
/ 15 мая 2009

Вероятно, самый простой способ справиться с этим - преобразовать его в строку и использовать одну из библиотек cocoadev regex для форматирования

1 голос
/ 15 мая 2009

Вы можете сделать это, преобразовав число в текстовое представление, используя itoa или sprintf, или применив собственную версию этого метода преобразования. Как только это будет сделано, вы можете использовать первые три символа из текстового буфера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...