我有一双:
let value = 0.99720317490866084
双重延伸功能:
extension Double {
func stringWithFixedFractionDigits(min: Int, max: Int) -> String {
let formatter = NumberFormatter()
formatter.minimumFractionDigits = min
formatter.maximumFractionDigits = max
formatter.minimumIntegerDigits = 1
let numberObject = NSNumber(value: self)
return formatter.string(from: numberObject) ?? "\(self)"
}
}
如果我使用:
value.stringWithFixedFractionDigits(min: 2, max: 2)
我得1.00
,但我想获得0.99
我可以改变什么?
答案 0 :(得分:3)
您只需将NumberFormatter舍入模式属性设置为.down:
formatter.roundingMode = .down
请注意,您不需要创建新的NSNumber对象,您可以安全地从Double转换为NSNumber或使用string(for: Any)
方法。作为替代方案,您可以扩展协议FloatingPoint以使其可用于所有Float类型:
extension Formatter {
static let number = NumberFormatter()
}
extension FloatingPoint {
func formattedWithFractionDigits(minimum: Int = 2, maximum: Int = 2, minimumIntegerDigits: Int = 1, roundingMode: NumberFormatter.RoundingMode = .ceiling) -> String {
Formatter.number.roundingMode = roundingMode
Formatter.number.minimumFractionDigits = minimum
Formatter.number.maximumFractionDigits = maximum
Formatter.number.minimumIntegerDigits = minimumIntegerDigits
return Formatter.number.string(for: self) ?? ""
}
}
0.9972031749.formattedWithFractionDigits() // 1.00
0.9972031749.formattedWithFractionDigits(roundingMode: .down) // "0.99"
0.9972031749.formattedWithFractionDigits(minimumIntegerDigits: 0, roundingMode: .down) // ".99"