将一个小数限制为两位小数

时间:2009-07-11 10:19:01

标签: c objective-c cocoa formatting

如何实现以下从double到字符串的转换:

1.4324 => "1.43"
9.4000 => "9.4"
43.000 => "43"

即。我想要舍入到小数位但不想要任何尾随零,即我不想要

9.4 => "9.40" (wrong)
43.000 => "43.00" (wrong)

所以我现在使用的这段代码不起作用,因为它显示多余的零:

[NSString stringWithFormat: @"%.2f", total]

5 个答案:

答案 0 :(得分:35)

你犯了一个简单的错误。这将有效:

[NSString stringWithFormat: @"%.2lf", total]

答案 1 :(得分:24)

答案 2 :(得分:4)

最简单的方法就是自己动手。我之前必须在C中执行此操作,因为无法通过printf格式化获得所需的行为。

在Objective-C中似乎也不容易。我试一试:

NSString *ftotal = [NSString stringWithFormat: @"%.2f", total];
while ([ftotal hasSuffix:@"0"]) {
    ftotal = [ftotal subStringToIndex [ftotal length]-1];
}
if ([ftotal hasSuffix:@"."]) {
    ftotal = [ftotal subStringToIndex [ftotal length]-1];
}

或此(可能更快)变体:

NSString *ftotal = [NSString stringWithFormat: @"%.2f", total];
if ([ftotal hasSuffix:@".00"]) {
    ftotal = [ftotal subStringToIndex [ftotal length]-3];
} else {
    if ([ftotal hasSuffix:@"0"]) {
        ftotal = [ftotal subStringToIndex [ftotal length]-1];
    }
}

stringWithFormat保证最后总会有".nn"(其中n是数字字符)。如果它是一个整数,whileif只会删除尾随零和尾随小数。

显然,您可能希望将其放在函数或类中,这样您就可以从任何地方获取它,而无需在整个地方复制代码。

答案 3 :(得分:1)

我不熟悉目标C,但这对于标准的printf样式格式化是不可能的。

使用%g可以分类工作,但对于大数或小数,它将使用科学记数法(例如9.6e + 6,4.2e-7)而不是十进制表示法。

equivalent question was asked for C/C++ here,在这种情况下,答案是使用%f,然后从字符串中删除任何尾随的0。不太优雅。

答案 4 :(得分:-2)

我很确定[[NSNumber numberWithFloat:f] stringValue]完全符合您的要求。