我正在尝试使用MPMediaPlaylists
来保存和检索persistentId
,这些是NSNumbers。由于我的类设置,我需要将这些ID保存为字符串。但是,当我尝试将字符串转换回NSNumbers时,它们以科学记数法而不是小数字出现。这是我的代码:
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
我错过了什么?
答案 0 :(得分:1)
来自文档:
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
同样来自文档:
这就是OP自己的答案有效的原因。
答案 1 :(得分:1)
事实:
NSNumberFormatter
会使您的字符串本地化(例如,本地化的小数点)。NSNumberFormatter
认为所有数字都是双打,所以你总是会失去精确度。答案:
不要使用NSNumberFormatter
,它根本不起作用。
要从数字中获取字符串,请使用-[NSNumber stringValue]
。
要从字符串中获取数字,请直接使用-[NSString longLongValue]
或NSScanner
。
当然,最好的解决方案是将ID保留为NSNumber
。将它转换为字符串并返回只会导致问题。
答案 2 :(得分:-2)
我找到了答案:
let number = NSDecimalNumber(string: playlists[indexPath.row].id)
这很好用。当NSNumberFormatter没有...
时,不确定它为什么会起作用