【问题标题】:Double String formatting madness双字符串格式化疯狂
【发布时间】:2015-02-10 07:56:47
【问题描述】:

我在操场上有以下内容:

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

但是:为什么 CGFloat 首先正确渲染,而 NSPoint 中的两个 CGFloats 被渲染为 0.00

不:它不是 Precision String Format Specifier In Swift 及其吊坠的复制品。

附:

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"

【问题讨论】:

    标签: swift formatting double


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      相关资源
      最近更新 更多