在swift中将Double转换为Scientific Notation

时间:2015-08-11 05:49:11

标签: ios swift math nsnumberformatter

我正在尝试将给定的双精度转换为科学记数法,并遇到一些问题。我似乎无法找到关于如何做到这一点的大量文档。目前我正在使用:

 var val = 500
 var numberFormatter = NSNumberFormatter()
 numberFormatter.numberStyle = NSNumberFormatterStyle.ScientificStyle
 let number = numberFormatter.numberFromString("\(val)")
 println(number as Double?) 
 // Prints optional(500) instead of optional(5e+2)

我做错了什么?

3 个答案:

答案 0 :(得分:8)

您可以设置NumberFormatter属性positiveFormat和exponent Symbol来格式化您的字符串,如下所示:

let val = 500
let formatter = NumberFormatter()
formatter.numberStyle = .scientific
formatter.positiveFormat = "0.###E+0"
formatter.exponentSymbol = "e"
if let scientificFormatted = formatter.string(for: val) {
    print(scientificFormatted)  // "5e+2"
}

更新: Xcode 9•Swift 4

您还可以创建扩展名以从数字类型获取科学格式化描述,如下所示:

extension Formatter {
    static let scientific: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.numberStyle = .scientific
        formatter.positiveFormat = "0.###E+0"
        formatter.exponentSymbol = "e"
        return formatter
    }()
}
extension Numeric {
    var scientificFormatted: String {
        return Formatter.scientific.string(for: self) ?? ""
    }
}
print(500.scientificFormatted)   // "5e+2"

答案 1 :(得分:3)

问题是您正在打印号码...而不是格式化的号码。您正在拨打numberForString而不是stringForNumber

var val = 500
var numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = NSNumberFormatterStyle.ScientificStyle
let numberString = numberFormatter.stringFromNumber(val)
println(numberString)

答案 2 :(得分:0)

leo-dabus对Xcode 9 Swift 4的答案略有修改:

extension Double {
    struct Number {
        static var formatter = NumberFormatter()
    }
    var scientificStyle: String {
        Number.formatter.numberStyle = .scientific
        Number.formatter.positiveFormat = "0.###E+0"
        Number.formatter.exponentSymbol = "e"
        let number = NSNumber(value: self)
        return Number.formatter.string(from :number) ?? description
    }
}