我想在Swift中将浮点值从1e-05
转换为0.00001
。
我使用了以下扩展名:
extension Float {
var avoidNotation: String {
let numberFormatter = NumberFormatter()
numberFormatter.allowsFloats = true
numberFormatter.maximumFractionDigits = 8
numberFormatter.numberStyle = .decimal
return numberFormatter.number(from: "\(self)")!.stringValue
}
}
但是当我尝试使用像1e-05.avoidNotation
这样的浮点值时,结果与0.00001
答案 0 :(得分:7)
您应该使用Formatter的string(for:)
方法,而不是从字符串插值得到的数字中获取stringValue:
extension Float {
var avoidNotation: String {
let numberFormatter = NumberFormatter()
numberFormatter.maximumFractionDigits = 8
numberFormatter.numberStyle = .decimal
return numberFormatter.string(for: self) ?? ""
}
}
Float(1e-05).avoidNotation // "0.00001"
我建议每次调用扩展Formatter并添加静态格式化程序的属性时,不要创建NumberFormatter。您还可以扩展FloatingPoint而不是Float,以便扩展所有浮点类型:
extension Formatter {
static let avoidNotation: NumberFormatter = {
let numberFormatter = NumberFormatter()
numberFormatter.maximumFractionDigits = 8
numberFormatter.numberStyle = .decimal
return numberFormatter
}()
}
extension FloatingPoint {
var avoidNotation: String {
return Formatter.avoidNotation.string(for: self) ?? ""
}
}
Float(1e-05).avoidNotation // "0.00001"
答案 1 :(得分:0)
Swift 4.2
禁用科学计数法:
let number = NSNumber(value: floatValue)
print(number.decimalValue)
扩展名:
extension Float {
func avoidNotation() -> String {
let number = NSNumber(value: self)
return "\(number.decimalValue)"
}
}