在swift中将科学记数法改为十进制

Ger*_*man 3 swift

我想一个浮点值从转换1e-050.00001斯威夫特.

我使用了以下扩展名:

extension Float {
    var avoidNotation: String {
      let numberFormatter = NumberFormatter()
      numberFormatter.allowsFloats = true
      numberFormatter.maximumFractionDigits = 8
      numberFormatter.numberStyle = .decimal
      return numberFormatter.number(from: "\(self)")!.stringValue
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用浮点值时,1e-05.avoidNotation结果却是一样的0.00001

Leo*_*bus 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"
Run Code Online (Sandbox Code Playgroud)

我建议每次调用扩展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"
Run Code Online (Sandbox Code Playgroud)