swift 中无法显示最多三位小数浮点值的字符串值

Unable to show string value to upto three decimal float value in swift

我正在使用如下所示的方式将字符串显示为小数点后三位浮动

extension String {
var toThreeDecimalAmount : String{
    return String(format: "%.3f", NSString(string: self).doubleValue)
}
}

extension Double {
var toThreeDecimalAmount : String{
    return String(format: "%.3f", self)
}
}

并且所有值类型如下所示。如果我将所有值一起使用以显示在 lblTotalPrice

var CURRENCY_FACTOR : Float = 1
public var currency_code : String?
public var total : String?

self.lblTotalPrice.text = "Total \(CURRENT_CURRENCY.currency_code ?? "$")\(((self.cartDB?.result?.cart?.total ?? "0") as NSString).floatValue * CURRENCY_FACTOR)"

o/p

 9.12345

对于以上值,如果我像下面那样使用 toThreeDecimalAmount,那么 o/p 变为 0.0

self.lblTotalPrice.text = "Total \(CURRENT_CURRENCY.currency_code ?? "$")\(((self.cartDB?.result?.cart?.total ?? "0") as NSString).floatValue * CURRENCY_FACTOR)".toThreeDecimalAmount

o/p就这样来了

0.000    

我需要像这样显示9.123,怎么做..请帮助

您可以像下面这样使用 NSDecimalNumber -

extension NSDecimalNumber {
    
    func roundToDecimalPlaces(_ decimalPlaces: Int16) -> NSDecimalNumber {
        let behaviors = NSDecimalNumberHandler(roundingMode: .bankers, scale: decimalPlaces, raiseOnExactness: false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: false)
        return self.rounding(accordingToBehavior: behaviors)
    }
    
}

测试

let string = "999.12345"
let number = NSDecimalNumber(string: string)
for i in 0...5 {
    print("\(i) decimal places : \(number.roundToDecimalPlaces(Int16(i)))")
}

输出

0 decimal places : 999
1 decimal places : 999.1
2 decimal places : 999.12
3 decimal places : 999.123
4 decimal places : 999.1234
5 decimal places : 999.12345

更新

如果你需要总是四舍五入到小数点后三位,你可以像这样更进一步。

extension String {
    func roundedTo3DecimalPlaces() -> String {
        let number = NSDecimalNumber(string: self)
        return number.roundedTo3DecimalPlaces()
    }
}

extension NSDecimalNumber {
    func roundedTo3DecimalPlaces() -> String {
        "\(self.roundToDecimalPlaces(Int16(3)))"
    }
}

现在您的呼叫站点已简化为此。

label.text = "999.12345".roundedTo3DecimalPlaces()