【发布时间】:2022-11-02 18:59:50
【问题描述】:
我正在尝试正确减小比例,格式化浮点值并将其作为 Swift 中的字符串返回。
例如:
let value: Float = 4.8962965
// formattedFalue should be 4.90 or 4,90 based on localization
let formattedValue = value.formatNumber()
这是我所做的:
extension Float {
func reduceScale(to places: Int) -> Float {
let multiplier = pow(10, Float(places))
let newDecimal = multiplier * self // move the decimal right
let truncated = Float(Int(newDecimal)) // drop the fraction
let originalDecimal = truncated / multiplier // move the decimal back return originalDecimal
}
func formatNumber() -> String {
let num = abs(self)
let numberFormatter = NumberFormatter()
numberFormatter.usesGroupingSeparator = true
numberFormatter.minimumFractionDigits = 0
numberFormatter.maximumFractionDigits = 2
numberFormatter.roundingMode = .up
numberFormatter.numberStyle = .decimal
numberFormatter.locale = // we take it from app settings
let formatted = num.reduceScale(to: 2)
let returningString = numberFormatter.string(from: NSNumber(value: formatted))!
return "\(returningString)"
}
}
但是当我使用此代码时,我得到 4.89(或 4,89,具体取决于本地化),而不是我期望的 4.90(或 4,90)。
提前致谢。
【问题讨论】:
-
删除不必要的
reduceScale方法,它可能会按预期工作。您正在将小数截断为4.89,它不能再四舍五入了(它已经四舍五入了)。 -
嗨@Sulthan 感谢您的回复。我删除了 reduceScale 方法,现在我直接返回 let returnedString = currencyFormatter.string(from: NSNumber(value: num))!但我得到 4.9。
-
那是因为您指定了
minimumFractionDigits = 0。如果您总是想显示两位小数,则必须设置minimumFractionDigits = 2。 -
非常感谢@Sulthan 现在它按预期工作!我并不总是希望 minimumFractionDigits 为 0,所以我将它作为参数动态传递。
标签: swift