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()
我正在使用如下所示的方式将字符串显示为小数点后三位浮动
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()