2015-02-09 57 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因为小数本身占有一席之地。