我正在尝试使用它们的 persistentId
(NSNumbers)来保存和检索 MPMediaPlaylists
。由于我的类(class)设置,我需要将这些 ID 保存为字符串。但是,当我尝试将字符串转换回 NSNumber 时,它们以科学记数法而不是十进制形式出现。这是我的代码:
let numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
let number = numberFormatter.numberFromString(playlists[indexPath.row].id)
println(playlists[indexPath.row].id)
println(number)
.id 是我的播放列表对象的一个属性,它是一个字符串。对于一个播放列表,输出:
13818827612659406491
1.381882761265941e+19
我错过了什么?
最佳答案
来自文档:
Double 的精度至少为 15 位小数,而 Float 的精度可以低至 6 位小数。要使用的适当浮点类型取决于您需要在代码中使用的值的性质和范围。
您的号码精度超过 15 位。
let str = "13818827612659406491" // 20 digits
let numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
let number = numberFormatter.numberFromString(str) //13,818,827,612,659,400,000.0 - 15 significant digits
同样来自文档:
NSDecimalNumber 是 NSNumber 的一个不可变子类,它提供了一个面向对象的包装器来进行以 10 为基数的算术运算。实例可以表示任何可以表示为尾数 x 10^exponent 的数字,其中尾数是长度不超过 38 位 的十进制整数,指数是从 –128 到 127 的整数。
这就是 OP 自己的答案有效的原因。
关于ios - NSNumberFormatter 设置为十进制样式时返回科学记数法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24383562/