Swift NumberFormatter将所有值格式化为3个小数位?

Jer*_*emy 0 arrays number-formatting ios swift



我有一大堆双打,有不同的小数位数,例如:

[11307.3, 1025.64, 1.27826, 1676.46, 0.584175, 183.792, 1.02237, 13.649, 0.472665, 127.604]
Run Code Online (Sandbox Code Playgroud)

我正在尝试格式化数字,因此每千个符号都有逗号,小数位不会格式化为特定的数字,如3dp.数组看起来应该是这样的

[11,307.3, 1,025.64, 1.27826, 1,676.46, 0.584175, 183.792, 1.02237, 13.649, 0.472665, 127.604]
Run Code Online (Sandbox Code Playgroud)


我试过通过定义NumberFormatter来做到这一点:

let numberFormatter = NumberFormatter()
Run Code Online (Sandbox Code Playgroud)

然后为样式选择十进制:

numberFormatter.numberStyle = NumberFormatter.Style.decimal
Run Code Online (Sandbox Code Playgroud)

数组中的值显示在表视图中,当用户点击例如第二个单元格时,在新屏幕中将显示值1,025.64.我使用这段代码来做到这一点:

var formattedPrice = numberFormatter.string(from: NSNumber(value:coinPriceDouble!))
self.coinPriceLbl.text = "\(coinTitleText!): \(Cryptocoin.instance.fiatSymbol)\(formattedPrice!)"
Run Code Online (Sandbox Code Playgroud)


这适用于任何不超过3位小数的值.如果用户选择数组中的第3个值,则显示1.278而不是1.27826.

有没有办法用逗号格式化这些值但不强制它们到特定的小数位数?

Lor*_*o B 10

正如vadian所说,NumberFormatter高度可定制.

只是玩它的属性,比如(你需要根据你的需要定制):

let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.maximumFractionDigits = 3
Run Code Online (Sandbox Code Playgroud)

这里说明NumberFormattermaximumFractionDigits财产和相关.

这里是一个博客,解释了NumberFormatter 指南的NSNumberFormatter所有相关方面.

编辑

将以下代码放在Playground中并观察结果:

let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.maximumFractionDigits = 3

let formattedNumbers = [11307.3, 1025.64, 1.27826, 1676.46, 0.584175, 183.792, 1.02237, 13.649, 0.472665, 127.604].flatMap { number in
    return numberFormatter.string(from: number)
}
print(formattedNumbers)
Run Code Online (Sandbox Code Playgroud)

  • 也许我误解了这个问题,但对我来说,似乎OP实际上想要更改`numberFormatter.maximumFractionDigits`的默认值,实际上是3(如果你测试你的代码而没有将它设置为3,你会得到完全相同的结果) .根据我的理解,OP实际上想要保持值的精度,并且只想将小数分隔符添加到值,但保持小数部分不变. (2认同)

Jer*_*emy 8

链接:https : //stackoverflow.com/a/27571946/6655075

这解决了我的问题。由于我显示了 3 个值,每个值都来自不同的数组,因此我最终会格式化所有 3 个值,而我只想格式化 1 个数组。

   extension Double {
        static let twoFractionDigits: NumberFormatter = {
            let formatter = NumberFormatter()
            formatter.numberStyle = .decimal
            formatter.minimumFractionDigits = 2
            formatter.maximumFractionDigits = 2
            return formatter
        }()
        var formatted: String {
            return Double.twoFractionDigits.string(for: self) ?? ""
        }
    }
Run Code Online (Sandbox Code Playgroud)

我删除了

var formattedPrice = numberFormatter.string(from: NSNumber(value:coinPriceDouble!))    
Run Code Online (Sandbox Code Playgroud)


并简单地使用

self.coinPriceLbl.text = "\(coinTitleText!): \(Cryptocoin.instance.fiatSymbol)\(coinPriceDouble!.formatted)"
Run Code Online (Sandbox Code Playgroud)



编辑:正如 Dávid Pásztor 所提到的,我只想将逗号分隔符添加到需要它的值中,同时仍然保持每个值的精度到最后一个十进制值。