2009-07-11 85 views
18

如何實現從雙到字符串如下轉換:限制雙到小數點後兩位

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

這不是http://stackoverflow.com/questions/4985791/round-double-value-to-2-decimal-places的副本,所以我覺得應該是無人盯防的重複。這個問題是關於如何限制到兩位小數的*最大*,而另一個問題是如何限制*總是*兩位小數。後者很容易,在原始問題中已經提到。 – 2015-05-27 10:58:14

+0

是的,它不是重複的。有人對他們的mod權力感到興奮。 – Jacob 2015-05-27 22:07:58

回答

1

我不熟悉的客觀C,但這是不可能的標準printf風格的格式。

使用%g將排序的工作,但對於大或小的數字,它將使用科學記數法(如9.6E + 6,4.2E-7),而不是十進制格式。

equivalent question was asked for C/C++ here,並且在此情況下,答案是使用%F,然後從字符串中去除任何尾隨0。不完全優雅。

+0

嘿,那是我的答案,你打電話不雅:-)實際上,它在Objective-C中更加優雅,因爲字符串實際上是字符串,而不是C char數組和其所有的弱點。 – paxdiablo 2009-07-11 11:27:42

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只消除尾隨零和尾隨小數(如果它是整數)。

很明顯,你可能希望把它放在一個函數或類,所以你可以在它從任何地方得到,而不必複製代碼所有的地方。

-2

我敢肯定,[[NSNumber的numberWithFloat:F] stringValue的]不正是你想要的。

35

你犯了一個簡單的錯誤。這將工作:

[NSString stringWithFormat: @"%.2lf", total] 
相關問題