当设置为十进制样式时,NSNumberFormatter返回科学记数法

时间:2014-06-24 09:53:37

标签: ios swift nsnumber

我正在尝试使用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

我错过了什么?

3 个答案:

答案 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

同样来自文档:

NSDecimalNumber是NSNumber的一个不可变子类,它提供了一个面向对象的包装器,用于执行base-10算术。实例可以表示任何可以表示为尾数x 10 ^指数的数字,其中尾数是十进制整数,最多 38位长,指数是-128到127之间的整数。

这就是OP自己的答案有效的原因。

答案 1 :(得分:1)

事实:

  1. 您的号码不是十进制数
  2. NSNumberFormatter会使您的字符串本地化(例如,本地化的小数点)。
  3. NSNumberFormatter认为所有数字都是双打,所以你总是会失去精确度。
  4. 答案:

    不要使用NSNumberFormatter,它根本不起作用。 要从数字中获取字符串,请使用-[NSNumber stringValue]。 要从字符串中获取数字,请直接使用-[NSString longLongValue]NSScanner

    当然,最好的解决方案是将ID保留为NSNumber。将它转换为字符串并返回只会导致问题。

答案 2 :(得分:-2)

我找到了答案:

let number = NSDecimalNumber(string: playlists[indexPath.row].id)

这很好用。当NSNumberFormatter没有...

时,不确定它为什么会起作用