【问题标题】:how should nsdecimalnumber's be stored in the database?nsdecimalnumber 应该如何存储在数据库中?
【发布时间】:2010-10-12 21:21:36
【问题描述】:

在数据库中存储 nsdecimalnumbers 的最佳方式是什么?浮点、实数和双精度等数值类型已被淘汰,因为保持货币使用的精度很重要。

我考虑过的两种选择是字符串并存储两个整数,一个保存尾数,一个保存指数。后一种方法面临的挑战是,我没有看到一种简单的方法可以将尾数和指数从 nsdecimalnumber 中提取出来。我可以从 NSDecimalNumber 获得 NSDecimal,但尾数和指数属性似乎是私有的!也许我可以反转 number = (mantissa * 10^exponent),但是有没有更好的方法来做到这一点?

我的要求是我需要对数据库中的这个字段执行一些聚合求和操作。如果我存储为字符串,则执行此计算可能会更加困难。我仍然需要编写一个自定义函数来对数据库中的尾数和指数求和,所以它可能仍然很重。

编辑:我可以访问指数,但尾数以一种奇怪的方式保存...在调试器中戳它会发现它是一个 short(ints) 数组。

【问题讨论】:

  • 你意识到 NSDecimal 是在 NSDecimal.h 中定义的,如果你在按住 cmd 的同时双击可见?它也在文档中列出,尽管它说这些字段是私有的。
  • 是的,我知道我现在可以访问它们,但是尾数被保存为一个短整数数组。我猜这是 unsigned long long 的实现细节?如何可靠地从一组短整数中读取?

标签: objective-c ios4 nsdecimalnumber


【解决方案1】:

NSDecimalNumber 符合NSCoding,因此您可以在将其添加到数据库之前使用encodeWithCoder: 对其进行编码,然后在从数据库中检索它时使用initWithCoder: 对其进行解码。

有关使用编码器的更多详细信息,请参阅Archives and Serializations Programming Guide,特别是“Encoding and Decoding Objects”。

【讨论】:

  • 这是一个有趣的提议。如果数据库不仅由 iphone 查看,而且还同步到服务器上,可能会被 PHP 或 Java 访问?
  • 它不是那么简单,但你可以让它工作。可能最好的方法是编写自己的编码器并在 Java 和 PHP 中创建等效的解码器(或解串器)类。但是,现在您又回到了最初的问题,因为您必须决定如何正确编码 NSDecimal 的组件。
猜你喜欢
  • 1970-01-01
  • 2011-04-02
  • 2012-11-12
  • 2015-03-16
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 2012-12-17
相关资源
最近更新 更多