Precision String Format Specifier In Swift

前端 未结 30 1979
面向向阳花
面向向阳花 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:17
    @infix func ^(left:Double, right: Int) -> NSNumber {
        let nf = NSNumberFormatter()
        nf.maximumSignificantDigits = Int(right)
        return  nf.numberFromString(nf.stringFromNumber(left))
    }
    
    
    let r = 0.52264
    let g = 0.22643
    let b = 0.94837
    
    println("this is a color: \(r^3) \(g^3) \(b^3)")
    
    // this is a color: 0.523 0.226 0.948
    
    0 讨论(0)
  • 2020-11-22 06:18

    Power of extension

    extension Double {
        var asNumber:String {
            if self >= 0 {
                var formatter = NSNumberFormatter()
                formatter.numberStyle = .NoStyle
                formatter.percentSymbol = ""
                formatter.maximumFractionDigits = 1
                return "\(formatter.stringFromNumber(self)!)"
            }
            return ""
        }
    }
    
    let velocity:Float = 12.32982342034
    
    println("The velocity is \(velocity.toNumber)")
    

    Output: The velocity is 12.3

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

    Most answers here are valid. However, in case you will format the number often, consider extending the Float class to add a method that returns a formatted string. See example code below. This one achieves the same goal by using a number formatter and extension.

    extension Float {
        func string(fractionDigits:Int) -> String {
            let formatter = NSNumberFormatter()
            formatter.minimumFractionDigits = fractionDigits
            formatter.maximumFractionDigits = fractionDigits
            return formatter.stringFromNumber(self) ?? "\(self)"
        }
    }
    
    let myVelocity:Float = 12.32982342034
    
    println("The velocity is \(myVelocity.string(2))")
    println("The velocity is \(myVelocity.string(1))")
    

    The console shows:

    The velocity is 12.33
    The velocity is 12.3
    

    SWIFT 3.1 update

    extension Float {
        func string(fractionDigits:Int) -> String {
            let formatter = NumberFormatter()
            formatter.minimumFractionDigits = fractionDigits
            formatter.maximumFractionDigits = fractionDigits
            return formatter.string(from: NSNumber(value: self)) ?? "\(self)"
        }
    }
    
    0 讨论(0)
  • 2020-11-22 06:19

    You can't do it (yet) with string interpolation. Your best bet is still going to be NSString formatting:

    println(NSString(format:"%.2f", sqrt(2.0)))
    

    Extrapolating from python, it seems like a reasonable syntax might be:

    @infix func % (value:Double, format:String) -> String {
        return NSString(format:format, value)
    }
    

    Which then allows you to use them as:

    M_PI % "%5.3f"                // "3.142"
    

    You can define similar operators for all of the numeric types, unfortunately I haven't found a way to do it with generics.

    Swift 5 Update

    As of at least Swift 5, String directly supports the format: initializer, so there's no need to use NSString and the @infix attribute is no longer needed which means the samples above should be written as:

    println(String(format:"%.2f", sqrt(2.0)))
    
    func %(value:Double, format:String) -> String {
        return String(format:format, value)
    }
    
    Double.pi % "%5.3f"         // "3.142"
    
    0 讨论(0)
  • 2020-11-22 06:19
    import Foundation
    
    extension CGFloat {
        var string1: String {
            return String(format: "%.1f", self)
        }
        var string2: String {
            return String(format: "%.2f", self)
        }
    }
    

    Usage

    let offset = CGPoint(1.23, 4.56)
    print("offset: \(offset.x.string1) x \(offset.y.string1)")
    // offset: 1.2 x 4.6
    
    0 讨论(0)
  • 2020-11-22 06:19
    //It will more help, by specify how much decimal Point you want.
    let decimalPoint = 2
    let floatAmount = 1.10001
    let amountValue = String(format: "%0.*f", decimalPoint, floatAmount)
    
    0 讨论(0)
提交回复
热议问题