双字符串格式化疯狂

Double String formatting madness

我在操场上有以下内容:

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 之外的其他东西(关于此格式化功能的 Apple 文档是 - 礼貌 - 非常薄,酸橙将变为零)。

但是:为什么 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”

CGFloat 不是浮点数或双精度数,它是自己的结构。如果您想要 CGFloat 的双精度或浮点值(这取决于架构是 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 因为小数本身占了一个位置。