双字符串格式化疯狂

时间:2015-02-09 22:20:37

标签: swift formatting double

我在操场上有以下内容:

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中的两个CGFloat呈现为NSPoint时,为什么第一个地方的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:Isn' t %2.2f应打印" 9.87"而不是" 9.87" (前导数字有2个位置?似乎忽略了数字。指定%02.2f也打印" 9.87"而不是" 09.87"

1 个答案:

答案 0 :(得分:1)

CGFloat不是float或double,它是自己的struct。如果你想要CGFloat的double或float值(取决于体系结构为32或64但是,你可以用a.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因为小数本身就占了一席之地。