.NET 的货币数据类型是什么?

35

寻找一个适合.NET的良好的货币数据类型,能够支持货币汇率(以及相关行为和操作)。

  • 注意:我开始在作者Kent Beck的书《通过示例学习测试驱动开发》中看到源代码,他开发了一个很好的Monetary概念。但无法在网上找到完整的源代码。该书没有一个单一的清单 - 相反,它在整本书的过程中开发了源代码。

虽然这本书没有深入探讨,但我也想让Money类支持不同的舍入机制,因为这也因金融机构在全球范围内而异。

编辑1:澄清

通过“Money class”,我的意思是我可以使用.NET数据类型来支持货币及其操作,包括货币支持和汇率计算等。这样的东西是更高级别的抽象化,可能在内部使用原始数据类型。它还可能依赖于一组诸如Money、ExchangeRate、Bank等类的绑定。

它可能是值类型(即结构体)或引用类型(即类),但无论哪种方式,都应该是完整的,并支持上述功能。

编辑2:Money数据类型的目标

(这也说明了原始的十进制、整数或其他原始类型无法满足所有Money需求)

Money数据类型的目标是:

  • 安全性特征(例如,防止在不同货币类型之间进行算术运算)。
  • 将货币类型与价值一起存储(例如,AUD,US,DKK)。
  • 存储格式化细节(例如,小数点分组、货币符号等)。
  • 转换提供程序(例如汇率)以帮助完善解决方案。
  • 减少表达式中的多种货币,以达到结果。

注意: 可以从外部来源加载并使用不同的数据值,例如汇率。该问题并未暗示任何动态特性已经编码到货币概念中。


@m3rLinEz:使用案例是任何交易货币的应用程序。要求专门的数据类型,以封装和抽象的精神在许多需要全球范围内的资金及其操作的不同应用程序中使用。 此外,为了获得数据类型的好处,如可维护性,可重用性,可测试性等等。寻找比您考虑的更高级别的抽象-当然,Web服务最终可以用于获取汇率信息,但首先我想要的是资金抽象来支持这些功能。 - John K
1
我认为“货币”类的问题与时区相同:规则经常变化。实际上,情况比这更糟——至少对于日期/时间数据,我们有一个参考时区UTC,而货币则相互浮动。与货币单位相关的所有外部依赖关系使其成为封装的不良选择;实际上,货币只是一个带有区域代码的定点小数;任何比这更复杂的功能都会不可靠。 - Aaronaught
2
https://dev59.com/inVC5IYBdhLWcg3wfxQ8 - Mauricio Scheffer
5
这是一个开源项目,它提供了一组用于处理货币类型和货币金额的.NET类。此代码库包含各种货币计算器,可让您在.NET应用程序中轻松地执行货币计算。 - Mauricio Scheffer
2
http://www.michaelbrumm.com/money.html - Mauricio Scheffer
显示剩余5条评论
8个回答

9

Fowler使用整数类型来表示货币金额中的总美分,而不是使用十进制类型来表示剩余美分的美元值。 - John K
我为一个MMO编写了一个日志解析器,它可以跟踪您在游戏过程中掠夺的所有货币。虽然有几种不同面额的硬币,但最终以最低面值的硬币(铜币)来跟踪所有赚取的钱款更容易。这使得对这些资金进行操作相对容易,并且您不必担心舍入误差。 - mmcdole
3
如果你不需要处理需要维护分数的严格财务信息(例如货币市场、交易等),将货币视为整数,例如将十进制3.58表示为整数358个美分是可行的。使用货币整数数量适用于简单的零售等基本货币需求。 - John K
这是正确的,整数问题也很容易解决。我开发了一个自定义的数字类,长度无限,像BigInteger一样,但带有小数位和完整的数学功能。我认为不需要特殊的货币类,只需要业务逻辑和格式化帮助器,例如。当然,您仍然需要在容器类/结构(例如业务对象,“订单”)中存储货币名称。尝试在每个金额中存储有关货币的所有信息,即使仅是货币名称,也是设计错误,因为这是一种完全浪费内存/负载的方式。 - Tony Wall

7

NodaMoney 提供了一个库,将货币视为 .NET 中的一等公民,并处理所有丑陋的部分,如货币和格式。

它符合 ISO 4217 中的货币标准。这是 java 库 JodaMoney 的 .NET 对应物。


5

货币数据类型 @ The Code Project

http://www.codeproject.com/KB/vb/moneyDatatype.aspx

作者提到类似的问题:

最近我在一个应用程序中发现.NET对货币支持不足,不要误解我的意思, 有许多“零件”,但所有项目的粘合剂都缺失,因此本文是对此的回应。

并实现了目标

我的主要目标如下:

  • 存储货币类型和值(即AUD、US、DKK等)。
  • 存储格式设置细节(即小数分组、货币符号等)。
  • 转换提供者,我不想将其硬编码,因为它是一种数据类型而不是解决方案。
  • 开发安全功能(例如,防止在不同货币类型上进行算术运算)。

到目前为止,这是最接近我所寻找的.NET代码。它满足Money的大部分要求。

如果有人有更好的东西,将不胜感激。


这看起来不错。并且为我指明了Money类应该拥有哪些操作。 - Gant

2
如果您正在寻找模式,您可以查看Joda Money。它是Java编写的,但应该可以给您一些有关API的想法。由于操作符重载,C#实现会少得多冗长。

这很不错,因为Java语法相对容易移植到C#,并且“借鉴”概念是有用的,正如建议的那样。 - John K

1

请看这里:

http://blogs.msdn.com/lucabol/archive/2008/12/04/financial-functions-for-net-released.aspx

它提供了一个.NET库,复制了所有Excel财务函数。
进行货币转换是棘手的,因为显然它会不断变化,所以硬编码的值将更或多或少无用。但是,您可以使用Web服务来访问最新的汇率。 这个 看起来是一个很好的开始。更好的是,同一转换器的REST风格接口:
http://www.webservicex.com/CurrencyConvertor.asmx/ConversionRate?FromCurrency=GBP&ToCurrency=EUR

这样就输出了英镑兑欧元的汇率。


这很有趣,它可能包含一些有用的财务计算,但我正在寻找一个独立的货币类来用作数据类型。我扫描了金融库的源代码,但没有找到这样的东西,只有函数。当然,也许是因为我不太了解F# - 如果类实际上在里面,请告诉我。 - John K

1

你可能会发现创建自己的类会导致最好的解决方案。


我感到惊讶,因为我的初始反应是:对于这样的事情可能有大量的选项。如果没有答案提供合适的预制解决方案,那么我可能不得不像你说的那样去做。实际上,我已经为此开始了尝试。 - John K

1

我是NMoneys的作者,我认为它可能会方便很多人。

尽管它尚未“正式发布”,但在正式发布前,它几乎不会有太大的变化。


0

我理解您对于在货币上建立抽象层的益处的观点。但是,我的看法关于货币及其“操作”相当模糊。 对于其他东西,比如File,我清楚地知道应该有OpenReadWriteClose操作。 但对于货币,除了基本的数学运算(+、-、*、/)之外,我想不到还有什么。

我所知道的 C++ 量化金融库之一包含这种货币抽象(http://quantlib.org/reference/class_quant_lib_1_1_money.html)。但是,您可以清楚地看到,这只是一个非常薄的包装,它提供了基本的运算符重载和十进制单位转换。

在大多数情况下,我认为十进制可以满足您的要求。 如果您需要支持特定的货币操作,则可以自己编写类。


这是一个令人印象深刻的库,它支持Money数据类型,尽管.NET不被直接支持。FAQ中说:“7.2 QuantLib是否支持.NET?不是直接支持。但是,QuantLib的C#绑定可用;请参见扩展页面。”--http://quantlib.org/faq.shtml 当然,有办法将其强行转换为.NET,但就个人而言,我对它建议使用的SWIG绑定机制并不确定http://swig.sourceforge.net/。 - John K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接