5

在阅读了如何最好地正确处理多个时区的用户之后,我了解到要走的路是将所有日期存储在规范化的应用程序范围的时区中 -UTC然后应用规范化时区和个人用户之间的差异输出时的时区。今天我开始思考是否适合将这种方法应用于处理软件中的货币:

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

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

4

2 回答 2

4

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

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

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

“基本思想是有一个 Money 类,其中包含数字金额和货币的字段。您可以将金额存储为整数类型或固定十进制类型。对于某些操作来说,小数类型更容易,而对于其他操作来说,积分类型更容易。您绝对应该避免使用任何类型的浮点类型,因为这会引入 Money 旨在避免的那种舍入问题。大多数时候人们希望将货币值四舍五入为最小的完整单位,例如美元中的美分。但是, 有时需要小数单位. 重要的是要明确你正在使用哪种类型的钱, 特别是在使用这两种类型的应用程序中. 对这两种情况使用不同的类型是有意义的, 因为它们的行为相当算术下不同。

货币需要算术运算,以便您可以像使用数字一样轻松使用货币对象。但是货币的算术运算与数字上的货币运算有一些重要的区别。最明显的是,任何加法或减法都需要了解货币,以便在尝试将不同货币的货币加在一起时做出反应。最简单、最常见的反应是将不同货币的加在一起视为错误。在一些更复杂的情况下,您可以使用 Ward Cunningham 的钱袋子概念。这是一个对象,在一个对象中包含多种货币的货币。然后,该对象可以像任何货币对象一样参与计算。它也可以被计入货币。”

于 2011-09-27T19:47:45.063 回答
1

处理时间和货币之间的区别在于时区不会改变价值。

在处理货币价值时,您必须考虑实际货币的货币是什么。如果实际货币为美元,而您将其存储为欧元,那么当它们的值发生变化时,您将发现实际值和存储值之间存在差异。

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

于 2011-09-27T19:44:35.443 回答