2015-02-09 52 views
0

我在操場以下幾點:雙字符串格式化瘋狂

let a:CGFloat = 1.23 
let b:Double = 3.45 
let c:Float = 6.78 
String(format: "(%2.2f|%2.2f|%2.2f)",a,b,c) // prints "(3.45|6.78|0.00)" 
let d = NSMakePoint(9.87,6.54) 
String(format: "(%2.2f|%2.2f)",d.x,d.y) // prints "(0.00|0.00)" 

那麼,爲什麼c:Float呈現爲0.00。我可能需要f以外的其他東西(這個格式化函數的蘋果文件是 - 要禮貌 - 很薄,石灰變成零)。

但是:爲什麼CGFloat首先被正確渲染,而NSPoint中的兩個CGFloat被渲染爲0.00

並且不:它不是Precision String Format Specifier In Swift及其吊墜的副本。

P.S.

String(format: "(%2.2f|%2.2f)",Double(d.x),d.y) // prints "(9.87|0.00)" 

這是一個工作,但沒有解釋。

並有PPS:?是不是應該%2.2f打印「9.87」,而不是「9.87」(2處爲主導的數字似乎忽略數量指定%02.2f還打印出「9.87」,而不是「09.87」

回答

1

CGFloat不是float或double,它是它自己的結構。如果你想要一個CGFloat的double或float值(這取決於架構是32或64,但是你可以用。.native換句話說嘗試:

String(format: "(%2.2f|%2.2f|%2.2f)",a.native,b,c) 

你會看到類似的行爲,如果你試圖通過其他非流通股和非雙參數到%f格式化程序。例如:

var str = "Hello, playground" 
String(format: "%2.2f|%2.2f|%2.2f", arguments: [str,b,c]) 

將導致「3.45 | 6.78 | 0.00」。它似乎正在尋找你的論點中的另一個浮動來滿足最後的%f,並且默認爲0.00

至於PPS。 %2.2F是小數點後兩位,總數至少爲2位。如果你想在小數點之前至少有兩位數字,你需要%5.2f。 5因爲小數本身佔有一席之地。