2009-07-07 57 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。将小数存储和检索为字符串可以避免任何即时和从浮点转换错误。