Swift NumberFormatter 将所有值格式化为 3 位小数?
Swift NumberFormatter formatting all values to 3 decimal places?
我有一大堆双精度数,它们的小数位数各不相同,例如:
[11307.3, 1025.64, 1.27826, 1676.46, 0.584175, 183.792, 1.02237, 13.649, 0.472665, 127.604]
我正在尝试格式化数字,因此每千位都有逗号,小数位未格式化为特定数字,例如 3dp。该数组应该看起来像
[11,307.3, 1,025.64, 1.27826, 1,676.46, 0.584175, 183.792, 1.02237, 13.649, 0.472665, 127.604]
我尝试通过这样定义 NumberFormatter 来做到这一点:
let numberFormatter = NumberFormatter()
然后为样式选择小数:
numberFormatter.numberStyle = NumberFormatter.Style.decimal
数组中的值显示在 table 视图中,当用户点击例如第二个单元格时,在新屏幕中将显示值 1,025.64。
我使用这段代码来做到这一点:
var formattedPrice = numberFormatter.string(from: NSNumber(value:coinPriceDouble!))
self.coinPriceLbl.text = "\(coinTitleText!): \(Cryptocoin.instance.fiatSymbol)\(formattedPrice!)"
这适用于任何不超过 3 位小数的值。
如果用户选择数组中的第三个值,它将显示 1.278 而不是 1.27826。
有没有办法用逗号格式化这些值,但不强制它们保留特定的小数位数?
您可以尝试将最大小数位数设置为较大的数字。
numberFormatter.maximumFractionDigits = 15
正如 vadian 所说,NumberFormatter
是高度可定制的。
随便玩玩它的属性,比如(你需要根据你的需要定制):
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.maximumFractionDigits = 3
这里是NumberFormatter
's maximumFractionDigits
property and related的解释。
这里是一个解释 NumberFormatter
A Guide to 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)
Link: .
这解决了我的问题。因为我显示了 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) ?? ""
}
}
我删除了
var formattedPrice = numberFormatter.string(from: NSNumber(value:coinPriceDouble!))
并简单地使用
self.coinPriceLbl.text = "\(coinTitleText!): \(Cryptocoin.instance.fiatSymbol)\(coinPriceDouble!.formatted)"
编辑:正如 Dávid Pásztor 提到的,我只想将逗号分隔符添加到需要它的值,同时仍然保持每个值的精度到最后一个十进制值。
我有一大堆双精度数,它们的小数位数各不相同,例如:
[11307.3, 1025.64, 1.27826, 1676.46, 0.584175, 183.792, 1.02237, 13.649, 0.472665, 127.604]
我正在尝试格式化数字,因此每千位都有逗号,小数位未格式化为特定数字,例如 3dp。该数组应该看起来像
[11,307.3, 1,025.64, 1.27826, 1,676.46, 0.584175, 183.792, 1.02237, 13.649, 0.472665, 127.604]
我尝试通过这样定义 NumberFormatter 来做到这一点:
let numberFormatter = NumberFormatter()
然后为样式选择小数:
numberFormatter.numberStyle = NumberFormatter.Style.decimal
数组中的值显示在 table 视图中,当用户点击例如第二个单元格时,在新屏幕中将显示值 1,025.64。 我使用这段代码来做到这一点:
var formattedPrice = numberFormatter.string(from: NSNumber(value:coinPriceDouble!))
self.coinPriceLbl.text = "\(coinTitleText!): \(Cryptocoin.instance.fiatSymbol)\(formattedPrice!)"
这适用于任何不超过 3 位小数的值。
如果用户选择数组中的第三个值,它将显示 1.278 而不是 1.27826。
有没有办法用逗号格式化这些值,但不强制它们保留特定的小数位数?
您可以尝试将最大小数位数设置为较大的数字。
numberFormatter.maximumFractionDigits = 15
正如 vadian 所说,NumberFormatter
是高度可定制的。
随便玩玩它的属性,比如(你需要根据你的需要定制):
let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.maximumFractionDigits = 3
这里是NumberFormatter
's maximumFractionDigits
property and related的解释。
这里是一个解释 NumberFormatter
A Guide to 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)
Link: .
这解决了我的问题。因为我显示了 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) ?? ""
}
}
我删除了
var formattedPrice = numberFormatter.string(from: NSNumber(value:coinPriceDouble!))
并简单地使用
self.coinPriceLbl.text = "\(coinTitleText!): \(Cryptocoin.instance.fiatSymbol)\(coinPriceDouble!.formatted)"
编辑:正如 Dávid Pásztor 提到的,我只想将逗号分隔符添加到需要它的值,同时仍然保持每个值的精度到最后一个十进制值。