2014-06-24 33 views
1

我試圖保存和檢索MPMediaPlaylists使用它們的persistentId s,它們是NSNumbers。由於我的班級設置,我需要將這些ID保存爲字符串。但是,當我嘗試將字符串轉換回NSNumbers時,它們以科學記數法而非小數點出現。這是我的代碼:NSNumberFormatter設置爲十進制樣式時返回科學記數法

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 

我在想什麼?

回答

1

從文檔:

雙具有至少15位十進制數字的精度,而浮點精度可以小如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算術的面向對象的包裝。一個實例可以表示可被表示爲尾數×10 ^指數任何數,其中尾數是十進制整數高達38位長,和指數是從-128至127

的整數這就是爲什麼OP自己的答案有效。

+1

我需要檢索'MPMediaPlaylist'項目使用'MPMediaQuery'與id。另外從蘋果有關'MPMediaPlaylistPropertyPersistentID'屬性的文檔:「播放列表的持久標識符.Value是包含UInt64_t(無符號長整數)的NSNumber對象。」 – Garrett

+0

奇怪!請在Playground中嘗試以下操作... let ui:UInt64 = 13818827612659406491 //不是您所期望的! – Grimxn

+0

那*很*很奇怪...... UInt怎麼會有負號? – Garrett

1

事實:

  1. 您的號碼是不是一個小數
  2. NSNumberFormatter會讓你的本地化字符串(例如本地化小數點)。
  3. NSNumberFormatter認爲所有數字都是雙打,所以你總是會失去精確度。

答:

不要使用NSNumberFormatter,也不會在這裏工作的。 要從編號中獲取字符串,只需使用-[NSNumber stringValue]。 要從字符串中獲得數字,請直接使用-[NSString longLongValue]NSScanner

當然,最好的解決方案是將ID保留爲NSNumber。將其轉換爲字符串並返回只會導致問題。

+0

Swift似乎不允許'字符串'上的'longLongValue' – Garrett

+0

@Garrett是的,它只在'NSString'上。 'String'和'NSString'不總是可以互換的。因爲Swift還沒有自己的框架,所以你將不得不使用Obj-C對象,包括NSStrings ... – Sulthan

-2

我發現我的答案是:

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

這工作得很好。不知道爲什麼它的工作時,NSNumberFormatter沒有...

+2

「不知道爲什麼它在NSNumberFormatter沒有的時候工作」我建議閱讀其他答案並且這些評論完全解釋了爲什麼它不起作用。 – Fogmeister

+0

我明白爲什麼其他人不工作。但我不知道這個人是如何工作的。 – Garrett

+2

@Garrett因爲'NSDecimalNumber'使用十進制(10-base)算術(不是二進制),所以它不會失去精度。它也有它自己的解析器,所以有一個直接轉換字符串 - >數字,而'NSNumberFormatter'總是首先將字符串轉換爲'double'。此外,您不要求它將其格式化爲十進制數字...... – Sulthan

相關問題