从int/float获取前三位数字

4th*_*ace 2 iphone objective-c

我想从大浮点数或整数中获取前三位数,并在某些位置插入小数.例如:

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

MB
----------
1234599 >> 1.23
3422847 >> 3.42
Run Code Online (Sandbox Code Playgroud)

对于特定的数字,我将有"KB"和"MB"字符串.这将告诉我是否需要小数,如"MB"示例中所示.我查看了NSNumberFormatter,但不确定那里会有什么帮助.有什么建议?

e.J*_*mes 7

下面是一些快速而脏的代码来提取数字的前三位数(以NSString格式):

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

NSLog(@"%@", topDigits); // will output 123
Run Code Online (Sandbox Code Playgroud)


gle*_*man 6

等等,你想说32589字节是325 KB吗?

将数字重复除以1000直到结果小于1000,然后用你所拥有的printf格式进行格式化是没有意义的吗?


Jim*_*vey 5

实际上,决定用我自己的答案来填写.这是我生成用于从字节计数输出人体大小的字符串的例程:

#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] );
}
Run Code Online (Sandbox Code Playgroud)

它通过查看二进制幅度的顺序来确定正确的大小,使用1024作为基数(1024字节= 1KB,1024KB = 1MB等).在这样做时,它会缩小输入值(使用浮点运算),这样一旦它低于1024,它就具有人类可读的值和幅度说明符.然后它生成一个包含格式化值的字符串(字节没有小数位,任何较大幅度都有2个小数位),并检查幅度常数以确定要附加的后缀.