当前位置: 首页 > 知识库问答 >
问题:

在swift中无法将字符串值显示为最多三个十进制浮点值

谷梁淇
2023-03-14

我用下面的例子来显示字符串浮动到小数点后三位

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)"

订单号

 $999.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

订单是这样来的

0.000    

我需要像这样展示999.123美元,如何做到这一点。。请帮忙

共有1个答案

邹学民
2023-03-14

您可以使用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

如果您需要始终四舍五入到小数点后3位,您可以进一步这样做。

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()
 类似资料:
  • 我想从现有的浮点数中提取1个十进制浮点数。 我在Objective-C中做过:使浮点只显示两位小数 知道如何在Swift中实现吗?

  • 问题内容: 我想将二进制数转换为浮点数。这是一种可能性的示例: 给我正确的输出: 不幸的是,我正在使用二进制 字符串 ,即,我需要类似的东西。 但是,这不起作用: 我尝试使用它将带引号的可打印数据块转换回二进制并返回二进制数据。但是最终,我得到了同样的错误: 我了解输出数字是整数的情况,但是如果我想获得数字12.546怎么办?那么该函数对二进制字符串的调用是什么样的? 问题答案: 另一种选择是做

  • ()中的ValueError回溯(最近一次调用)---- ~\Anaconda3\lib\site packages\sklearn\preprocessing\data.py in fit_transform(self,X,y)2017”““2018年返回所选的fit_transform(X,self.\u fit_transform- ~\Anaconda3\lib\site-包\skLear

  • 问题内容: 我得到了在Objective-C中将String转换为HEX-String的代码。 我想要在Swift中也一样。任何人都可以在Swift中翻译此代码,或者在Swift中有任何简单的方法吗? 问题答案: 这是我的例行十六进制字符串: 为了完整起见,这是我的十六进制字符串例程: 请注意,如上所示,我通常只在十六进制表示形式和实例之间进行转换(因为如果可以将信息表示为字符串,则可能一开始就不

  • 关于将带浮点数的字符串转换为十进制浮点数的方法有很多讨论,但我没有找到用C语言解决问题的方法(python、C#等) 首先,我们输入初始数的数字系统,并将浮点数输入字符串变量。 然后将输入分成右(double)部分和左(int)部分,然后为这两部分调用函数void floatToDec(字符串输入,int sys,char标志)(标志“l”表示左部分标志“r”meens right part)。为

  • 我用JSON格式存储了很多颜色。我使用rootbeer via gulp将它们转换为sass映射,可以由SCSS处理: 至 我可以很好地使用语法中的颜色,但一旦应用了任何颜色函数,如,编译器就会失败,因为颜色类型完全消失了。 即使使用也不允许sass将其视为字符串,但它需要是一种颜色。 我的问题是,是否有任何方法可以让我强制编译器将此作为一种颜色来处理呢?另一种方法是省略所有内置颜色函数的使用。