我正在格式化浮点数,现在我有%0.2f格式化程序,但如果浮点数是偶数,我想省略.00。
当然我可以把字符串替换为.00,但这很粗糙。
我发现NSNumber的描述也做了类似的事情:
NSNumber *number = [NSNumber numberWithFloat:_paragraphSpacing];
[retString appendFormat:@"margin-bottom:%@px;", number];
这确实悬停不限制逗号后的数字。如果数字是1234.56789,那么描述将输出。
所以我的问题是,是否有一种同样简单的方法 - 可能无需创建NSNumber对象 - 来实现这一结果?
答案 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]];