2009-01-12 34 views
2

在我的iPhone應用程序中,我使用NSDecimalNumber來存儲一些貨幣匯率值。 我第一次啓動應用程序時,我從網絡上獲取數據,然後當它們變得過時時,再次將數據存儲在NSDictionary;然後我使用writeToFile:atomically:NSDictionary initWithContentsOfFile:弄亂NSDecimalNumbers,爲什麼?

當應用程序第一次啓動時,我的速度轉換方法工作正常。但是,當我第二次啓動應用程序時,費率會加載-(NSDictionary*) initWithContentsOfFile:轉換方法停止工作,並且我得到奇怪的結果。

我在導入的方法中對斷點進行了一些調試,發現費率數據爲NSCFNumber,而不是NSDecimalNumber。所以看起來initWithContentsOfFile不會將正確的類分配給我的對象。爲記錄,這些對象的實際值(如description方法中所示)對應於預期的費率值。

我也檢查了writeToFile:atomically:生成的plist文件,看到存儲的價格爲real;我想知道這是否是正確的類型。

想知道發生了什麼?

由於提前,
達維德

回答

6

屬性列表不十進制數和浮點數區分。 real元素包含一個浮點數。 (事實上​​,序列化本身可能僅僅是NSNumber自己發送floatValue,而不知道該實例實際上是一個子類。這意味着當你讀取plist數據時,而不是當你讀取它時,轉換爲浮點數發生英寸)

我必須將它存儲爲一個字符串。希望這是無損的。

+0

我已經使用了使用字符串存儲NSDecimalNumbers的方法,它似乎在保持精度方面做得很好。它看起來像你所能得到的那樣接近無損。 – 2009-01-12 15:30:14

5

Plists只能處理某些數據類型,NSNumber就是其中之一。如果你想要NSDecimalNumber,那麼你有兩種方法去解決它。首先是繼續使用plists,然後在加載後將所有的NSNumbers轉換爲NSDecimalNumbers。第二個是切換到使用NSKeyedArchiver存儲數據。這需要更多的代碼,但意味着如果你保存一個NSDecimalNumber,你會得到一個NSDecimalNumber。

+0

請注意,如果屬性列表序列化程序將數字視爲NSNumbers,並在序列化*時詢問其floatValue *,那麼您已經失去了該點的精確性。現在拿回這些信息爲時已晚。 – 2009-01-12 08:15:57

相關問題