6

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

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

我一直认为“有效数字”是指小数点前后的所有数字。无论如何,有没有办法使用 NSNumberFormatter 来完成这个?

谢谢!

4

3 回答 3

10

我相信

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

将完全按照您的意愿进行操作,即它将始终准确显示 3 位数字,无论是小数点前 2 位和小数点后 1 位,还是小数点前 1 位和小数点后 2 位。

于 2012-12-17T22:32:18.413 回答
4

也许您还必须设置(虽然不确定):

[distanceFormatter setUsesSignificantDigits: YES];

但是在您的情况下,仅使用标准字符串格式可能要容易得多:

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

(注意:这将四舍五入最后一位)

于 2012-03-23T16:41:12.477 回答
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];
}

在我的测试中,这很好用。

于 2012-03-23T16:40:41.290 回答