2

我正在格式化浮点数,现在我有 %0.2f 格式化程序,但如果浮点数是偶数,我想省略 .00 。

当然,我可以考虑用字符串替换 .00,但这很粗糙。

我发现 NSNumber 的描述也做了类似的事情:

NSNumber *number = [NSNumber numberWithFloat:_paragraphSpacing];
[retString appendFormat:@"margin-bottom:%@px;", number];

这不会悬停不限制后逗号数字。如果数字是 1234.56789,那么描述将输出该数字。

所以我的问题是,是否有一种同样简单的方法——可能不必创建 NSNumber 对象——来实现这个结果?

4

4 回答 4

1

由于浮点数不精确,因此无法保证您的数字实际上是整数。但是,您可以检查它是否在与整数值相当小的距离内。当然,您不需要为此提供 NSNumber。(一般来说,NSNumber 不用于格式化,其目的是使用 Objective-C 对象表示原始 C 类型,无论是整数类型还是浮点类型。)

#include <math.h>

- (NSString *)stringFromFloat:(float)f
{
    const float eps = 1.0e-6;
    if (abs(round(f) - f) < eps) {
        // assume an integer
        return [NSString stringWithFormat:@"margin-bottom: %.0fpx", round(f)];
    } else {
        // assume a real number
        return [NSString stringWithFormat:@"margin-bottom: %.2fpx", f];
    }
}
于 2012-12-23T19:20:20.973 回答
1

您可以使用 C 函数modff获取小数部分并对其进行测试:

float fractionPart = 0.;
modff(_paragraphSpacing, &fractionPart);
if( fabsf(fractionPart) < 0.01 ) {
  // format as integer
  [retString appendFormat:@"margin-bottom:%d", (int)_paragraphSpacing];
} else {
  // format as float
  [retString appendFormat:@"margin-bottom:%0.2f", _paragraphSpacing];
}
于 2012-12-23T19:27:27.300 回答
1

使用格式化程序:

NSNumberFormatter* formatter= [NSNumberFormatter new];
formatter.numberStyle= NSNumberFormatterDecimalStyle;
formatter.maximumFractionDigits=2;
NSNumber *number = [NSNumber numberWithFloat:_paragraphSpacing];
[retString appendFormat:@"margin-bottom:%@;", [formatter stringFromNumber: number]];
于 2012-12-23T19:38:51.757 回答
1

NSNumberFormatter您可以为此使用 an :

static NSNumberFormatter *numberFormatter = nil;
if (numberFormatter == nil) {
    numberFormatter = [[NSNumberFormatter alloc] init];
    numberFormatter.minimumFractionDigits = 0;
    numberFormatter.maximumFractionDigits = 2;
    numberFormatter.usesGroupingSeparator = NO;
}
NSString *formattedNumberString = [numberFormatter
     stringForNumber:[NSNumber numberWithDouble: _paragraphSpacing]];
于 2012-12-23T19:39:08.480 回答