2012-03-23 58 views
6

我想使它成为我的一个UILabels只显示最多3位数字。所以,如果相关的值是3.224789,我希望看到3.22。如果值是12.563,我希望看到12.5,如果值是298.38912,那么我想看到298.我一直在尝试使用NSNumberFormatter来完成此操作,但是当我将最大有效位数设置为3小数点后面总是有3位数字。这里的代码:NSNumberFormatter最多显示3位数

NSNumberFormatter *distanceFormatter = [[[NSNumberFormatter alloc] init] autorelease]; 
[distanceFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
[distanceFormatter setAlwaysShowsDecimalSeparator:NO]; 
[distanceFormatter setMaximumSignificantDigits:3]; 

我一直以为'有效数字'是指小数点前后的所有数字。无论如何,有没有办法使用NSNumberFormatter完成此操作?

谢谢!

回答

10

我相信

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
formatter.usesSignificantDigits = YES; 
formatter.maximumSignificantDigits = 3; 

将完全按照您的要求进行操作,即始终显示3位数字,小数点后2位,小数点前1位,小数点前1位,后2位。

+1

是的,这个效果很好。将'usesSignificantDigits'标志设置为YES是OP解决方案的关键。我只是用这个,实际上它在小数点上起作用,例如它将19.17美元转换为19.20美元。 – 2015-06-03 15:35:51

+0

请检查我的问题http://stackoverflow.com/questions/35112206/how-to-show-only-first-two-numbers-in-nsnumberformatter。它在Swift中不适合我 – Alexander 2016-01-31 14:56:24

2

继承人的一个小功能我写道:

int nDigits(double n) 
{ 
    n = fabs(n); 
    int nDigits = 0; 
    while (n > 1) { 
     n /= 10; 
     nDigits++; 
    } 

    return nDigits; 
} 

NSString *formatNumber(NSNumber *number, int sigFigures) 
{ 
    double num = [number doubleValue]; 
    int numDigits = nDigits(num); 

    NSString *format = [NSString stringWithFormat:@"%%%i.%ilf", sigFigures -= numDigits, sigFigures]; 

    return [NSString stringWithFormat:format, num]; 
} 

在我的测试,这工作得很好。

+0

感谢您理解这个问题。 “有效位数”与“小数点右侧的位数”有差异。 – 2012-12-17 20:56:44

4

也许你还可以设置(不知道虽然):

[distanceFormatter setUsesSignificantDigits: YES];

但在你的情况下,它可能更容易,只需使用标准的字符串格式化:

CGFloat yourNumber = ...; 
NSString* stringValue = [NSString stringWithFormat: @"%.3f", yourNumber]; 

(注:这将围绕最后一位数字)