如果number是整数,则省略分数格式编号的优雅方法

时间:2012-12-23 19:10:26

标签: iphone objective-c

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

当然我可以把字符串替换为.00,但这很粗糙。

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

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

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

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

4 个答案:

答案 0 :(得分: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];
    }
}

答案 1 :(得分: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];
}

答案 2 :(得分:1)

使用格式化程序:

NSNumberFormatter* formatter= [NSNumberFormatter new];
formatter.numberStyle= NSNumberFormatterDecimalStyle;
formatter.maximumFractionDigits=2;
NSNumber *number = [NSNumber numberWithFloat:_paragraphSpacing];
[retString appendFormat:@"margin-bottom:%@;", [formatter stringFromNumber: number]];

答案 3 :(得分:1)

您可以使用NSNumberFormatter

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]];