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

19

如何将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]

1
这不是https://dev59.com/0G445IYBdhLWcg3wM3fx的重复,因此我认为它应该被取消标记为重复。这个问题是关于如何限制最多两位小数,而另一个问题是如何始终限制为两位小数。后者很容易,在原始问题中已经提到了。 - Peter Theill
是的,这不是重复内容。只是有人对他们的修改权限感到兴奋。 - Jay
5个回答

35

您犯了一个简单的错误。这样会行:

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

7
可以,但是它是如何工作的? - Beniamin

24

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 语句只是简单地去除末尾的零和小数点(如果它是整数的话)。
显然,您可能希望将其放在一个函数或类中,以便可以从任何地方访问它,而不必在各个地方重复代码。

1

我不熟悉Objective C,但使用标准的printf格式化是不可能实现的。

使用%g会有点效果,但对于大数或小数,它将使用科学计数法(例如9.6e+6,4.2e-7)而不是十进制表示。

在C/C++中提出了类似的问题,在那种情况下,答案是使用%f,然后从字符串中去掉任何尾随的0。并不是非常优雅。


嘿,你说我的答案不够优雅 :-) 实际上,在Objective-C中更加优雅,因为字符串实际上是字符串,而不是带有所有怪癖的C字符数组。 - paxdiablo

-2

我非常确定[[NSNumber numberWithFloat:f] stringValue]恰好符合您的要求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接