存储货币时的常识?

时间:2011-09-27 19:37:39

标签: currency currency-exchange-rates

在正确阅读了如何获得最佳handle users in multiple timezones之后,我了解到要采用的方法是将所有日期存储在规范化的应用程序范围的时区 - UTC中,然后应用差异在输出时标准化时区和个人用户时区之间。今天我开始考虑是否适合采用这种方法来处理软件中的货币:

所有存储的货币都转换为应用程序范围的货币,比如EUR(€),输出时,货币会转换回用户自己的货币,并且当天的汇率更新?

这里有什么常识?在选择处理此方法之前,这通常如何解决,我应该注意什么?

2 个答案:

答案 0 :(得分:3)

一种标准方法是在持有和操纵货币价值时存储金额和货币。

请参阅Martin Fowler的企业应用程序架构模式中的Money Pattern

Fowler描述了定义一个简单的数据类型来保存两个原始组件,并使用重载的算术运算符来执行货币操作:

  

“基本的想法是为数字提供带有字段的Money类   金额和货币。您可以将金额存储为   整数类型或固定十进制类型。十进制类型更容易   一些操纵,是别人的积分。你绝对应该   避免任何类型的浮点类型,因为这将引入那种类型   解决Money旨在避免的问题。大多数时候   人们希望货币价值四舍五入到最小的完整单位,   比如美元美分。但是,有时候是分数   需要单位。明确什么样的钱很重要   您正在使用,尤其是在同时使用这两者的应用程序中   种。这两种情况的不同类型是有意义的   他们在算术上表现得完全不同。

     

Money需要算术运算才能使用货币对象   很容易使用数字。但钱的算术运算有   数字货币运作的一些重要差异。最   显然,任何加法或减法都需要具有货币意识   如果你试图将不同的货币加在一起,你可以做出反应   货币。最简单,最常见的反应是对待   将不同货币加在一起作为错误。还有一些   复杂的情况你可以使用Ward Cunningham的钱的想法   袋。这是一个包含多种货币的对象   在一个对象中。然后该对象可以参与   计算就像任何金钱对象一样。它也可以被重视为   货币“。

答案 1 :(得分:1)

处理时间和货币之间的区别在于时区的价值没有变化。

处理货币价值时,您必须考虑实际货币的货币。如果实际货币为美元并且您将其存储为欧元,那么当它们的价值变化时,您将得到实际值与存储值之间的差异。

或者,您必须在更新汇率时重新计算所有值,但这会消除以单一货币存储值的目的。