将一个双精度数限制为两位小数

如何实现从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] 

使用NSNumberFormatter 。 请参阅“ 数据格式编程指南 ”中有关数字格式化器的章节。

你弄错了。 这将有效:

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

最简单的方法就是自己滚动。 之前我必须在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简单地剥离尾随零和尾随小数(如果它是整数)。

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

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

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

这里有同等的问题要求C / C ++ ,在这种情况下答案是使用%f然后从字符串中删除任何尾随的0。 不完全优雅。

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