2009-07-07 59 views
1

我有一個plist(在XCode中創建),其中包含一個數組,其中包含整數「Numbers」(0.01,1,2,6),當使用initWithContentsOfFile重新構造時,解包爲NSValues。如何將這些NSValues轉換爲可用於添加在一起的NSDecimalNumbers?它們將被視爲貨幣值,因此只需要精確到2位(也許是4位)。將NSValue轉換爲NSDecimalNumber

我試過將plist值保存爲「String」而不是「Number」,並使用NSDecimalNumber的initWithString設置值,但是然後NSValue不響應stringValue。

似乎處理數字在可可中尤其令人困惑。如此多的框架中的許多容器格式... :-(

回答

0

第一課要學習的是,當表示貨幣時,如果想要任何類型的準確性,請使用整數而不是浮點(十進制)數字。通過100.0,當你需要顯示美分等)計算機是二進制(基數2)完美無瑕,但如果你嘗試用二進制表示一些不能被分解成因子1/(2^n)的東西,你會遇到精度錯誤。 (嘗試0.1 + 0.1,看看你得到了什麼。)

也就是說,你指定數字的XML標籤肯定會影響如何使用類似於-[NSArray initWithContentsOfFile:]的東西來解釋Cocoa類的值「重構」它。請參閱plist man pagethis Apple article以獲取更多詳細信息和示例。

要完成所要求的內容,請確保在plist中的值周圍使用<real><integer>(和匹配的結束標記)。 (根據數字是否有小數點,屬性列表編輯器和Xcode應自動使用正確的數字。)在我的測試中,實數和整數都作爲NSNumber對象讀入。 NSDecimalNumber是NSNumber的一個子類,但我並不完全確定如何在所有情況下使用CFNumber進行免費橋接。實驗可能是弄清楚的最好方法。

+0

乘以100的方法對大多數貨幣都很好,但它不是通用的。我想我可以從當前語言環境的NSNumberFormatter中獲取maximumFractionDigits,然後將我的整數乘以10^maxDigits。儘管如此,在這個現代化的計算時代,似乎並不應該像操縱貨幣一樣普遍地操縱這種困難/混亂...... – Meltemi 2009-07-07 08:12:12

1

您應該可以直接將數字作爲字符串存儲在屬性列表中。將它們存儲在plist中時,不需要爲NSStrings執行任何NSValue包裝。我建議將你的應用程序中的數字保存爲NSDecimals或NSDecimalNumbers,以避免任何浮點錯誤,使用initWithString:locale:從plist中讀取它們,並使用descriptionWithLocale:將它們寫入plist。將小數存儲和檢索爲字符串可以避免任何即時和從浮點轉換錯誤。