Precision String Format Specifier In Swift

前端 未结 30 2044
面向向阳花
面向向阳花 2020-11-22 05:58

Below is how I would have previously truncated a float to two decimal places

NSLog(@\" %.02f %.02f %.02f\", r, g, b);

I checked the docs an

相关标签:
30条回答
  • 2020-11-22 06:08

    less typing way:

    func fprint(format: String, _ args: CVarArgType...) {
        print(NSString(format: format, arguments: getVaList(args)))
    }
    
    0 讨论(0)
  • 2020-11-22 06:08

    Also with rounding:

    extension Float
    {
        func format(f: String) -> String
        {
            return NSString(format: "%\(f)f", self)
        }
        mutating func roundTo(f: String)
        {
            self = NSString(format: "%\(f)f", self).floatValue
        }
    }
    
    extension Double
    {
        func format(f: String) -> String
        {
            return NSString(format: "%\(f)f", self)
        }
        mutating func roundTo(f: String)
        {
            self = NSString(format: "%\(f)f", self).doubleValue
        }
    }
    
    x = 0.90695652173913
    x.roundTo(".2")
    println(x) //0.91
    
    0 讨论(0)
  • 2020-11-22 06:09

    My best solution so far, following from David's response:

    import Foundation
    
    extension Int {
        func format(f: String) -> String {
            return String(format: "%\(f)d", self)
        }
    }
    
    extension Double {
        func format(f: String) -> String {
            return String(format: "%\(f)f", self)
        }
    }
    
    let someInt = 4, someIntFormat = "03"
    println("The integer number \(someInt) formatted with \"\(someIntFormat)\" looks like \(someInt.format(someIntFormat))")
    // The integer number 4 formatted with "03" looks like 004
    
    let someDouble = 3.14159265359, someDoubleFormat = ".3"
    println("The floating point number \(someDouble) formatted with \"\(someDoubleFormat)\" looks like \(someDouble.format(someDoubleFormat))")
    // The floating point number 3.14159265359 formatted with ".3" looks like 3.142
    

    I think this is the most Swift-like solution, tying the formatting operations directly to the data type. It may well be that there is a built-in library of formatting operations somewhere, or maybe it will be released soon. Keep in mind that the language is still in beta.

    0 讨论(0)
  • 2020-11-22 06:09

    The answers given so far that have received the most votes are relying on NSString methods and are going to require that you have imported Foundation.

    Having done that, though, you still have access to NSLog.

    So I think the answer to the question, if you are asking how to continue using NSLog in Swift, is simply:

    import Foundation

    0 讨论(0)
  • 2020-11-22 06:09

    I don't know about two decimal places, but here's how you can print floats with zero decimal places, so I'd imagine that can be 2 place, 3, places ... (Note: you must convert CGFloat to Double to pass to String(format:) or it will see a value of zero)

    func logRect(r: CGRect, _ title: String = "") {
        println(String(format: "[ (%.0f, %.0f), (%.0f, %.0f) ] %@",
            Double(r.origin.x), Double(r.origin.y), Double(r.size.width), Double(r.size.height), title))
    }
    
    0 讨论(0)
  • 2020-11-22 06:10

    here a "pure" swift solution

     var d = 1.234567
    operator infix ~> {}
    @infix func ~> (left: Double, right: Int) -> String {
        if right == 0 {
            return "\(Int(left))"
        }
        var k = 1.0
        for i in 1..right+1 {
            k = 10.0 * k
        }
        let n = Double(Int(left*k)) / Double(k)
        return "\(n)"
    }
    println("\(d~>2)")
    println("\(d~>1)")
    println("\(d~>0)")
    
    0 讨论(0)
提交回复
热议问题