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

时间:2018-01-19 04:03:19

标签: swift

我想在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

相同

2 个答案:

答案 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)"
    }

}