我想从大浮点数或整数中获取前三位数,并在某些位置插入小数。例如:
KB
----------
32589 >> 325
43266 >> 432
MB
----------
1234599 >> 1.23
3422847 >> 3.42
对于特定号码,我将使用“KB”和“MB”字符串。这将告诉我是否需要小数,如“MB”示例中所示。我查看了NSNumberFormatter,但不确定那里会有什么帮助。有什么建议吗?
答案 0 :(得分:7)
这是一些快速&用于拉出数字前三位的脏代码(采用NSString格式):
long someNumber = 1234599;
NSString * allDigits = [NSString stringWithFormat:@"%l", someNumber];
NSString * topDigits = [allDigits substringToIndex:3];
NSLog(@"%@", topDigits); // will output 123
答案 1 :(得分:6)
等等,你想说32589字节是325 KB吗?
将数字重复除以1000直到结果小于1000,然后用你所拥有的任何printf格式进行格式化是没有意义的吗?
答案 2 :(得分: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] );
}
通过查看二进制幅度的顺序,使用1024作为基数(1024字节= 1KB,1024KB = 1MB等),计算出正确的大小。在这样做时,它会缩小输入值(使用浮点运算),这样一旦它低于1024,它就具有人类可读的值和幅度说明符。然后它生成一个包含格式化值的字符串(字节没有小数位,任何较大幅度都有2个小数位),并检查幅度常数以确定要附加的后缀。
答案 3 :(得分:1)
您可以通过使用itoa或sprintf将数字转换为文本表示形式或实现您自己的此转换技术版本来实现此目的。完成此操作后,您可以从文本缓冲区中提取前三个字符以使用。
答案 4 :(得分:1)
处理此问题的最简单方法可能是将其转换为字符串并使用其中一个cocoadev正则表达式库进行格式化