有人知道.NET中的货币类型吗?

20

有没有人知道针对.NET框架已经实现的支持i18n(货币、格式等)的货币类型?我一直在寻找一个良好实现的类型,但似乎找不到。


1
有趣的是,这个问题因为被认为是一个更新的问题的重复而被关闭了。我不知道这是怎么回事。 - Mateo
3个回答

17

请查看这篇文章CLR的货币类型

CLR的一种方便、高性能的货币结构,它处理算术运算、货币类型、格式化以及仔细分配和舍入而不丢失。


非常有趣。这在我之前的一个项目中会很有帮助。 - Jason Jackson
14
存在问题:(1)我看到过很多情况下,相等的货币值并不相等,需要先转换为十进制。 (2)它非常臃肿:包含 Int64、Int32、3 个字符串和一个 UInt16。作者没有理解 decimal 类型的本质。 (3)哈希函数相当次优。 (4)可以有小数点后几位的美分(没关系),但 ToString() 方法会四舍五入到两位小数。 - dan-gph
2
关于(1),我应该说过我曾经见过这样一种情况,即两个相等的Money值并不相等(其中一个的内部值没有被正确地规范化)。 - dan-gph
3
在我整理问题清单时:(5) 它有一个从 double 进行隐式转换的功能,这是危险的(decimal 没有这个功能)。 (6) IConvertible.ToBoolean 的转换是反向的(0 转换为 true)。 (7) 不支持的 IConvertible 转换会抛出 NotSupportedException 异常,而不是像规范中所述的 InvalidCastException。 - dan-gph
3
"MoneyDistributer" 只有三个单元测试,这让我感到担忧,因为有很多边角情况没有被测试到。 - dan-gph
@dan-gph InvalidCastException(而不是NotSupportedException)是正确的。在IConvertible的msdn文档上进行了验证。 - ActiveX

9

我认为你想使用十进制数据类型,并使用适当的重载方法ToString()

CultureInfo current  = CultureInfo.CurrentCulture;
decimal myMoney = 99.99m;

//formats as money in current culture, like $99.99
string formattedMoney = myMoney.ToString("C", current); 

是的...确保在处理货币时使用十进制类型。浮点数对于小数值不准确。 - Armstrongest
1
除了当前文化中使用的货币之外,其他货币怎么办? - DarkWanderer

2

1
你这里有一点错误。它不是一个非常低的面额,而是最低的面额。这是我所找到的唯一不会出错的答案——如果你的精度超出了现实范围,你在除法后得到的分数就会被误传。 - Loren Pechtel
6
然而,美国货币中分并不是最小面额;否则加油站就不能以$2.149/加仑的价格售卖汽油。类似地,百分比(如利率)通常会产生零头分,且在中间步骤中进行四舍五入并不总是适当的。 - technophile
@technophile是正确的。但我仍然同意Chii,对于大多数情况,使用整数来存储和处理货币比小数更可靠且更易于使用。特别是当您不必考虑小数点在欧洲有时是逗号的情况时。 - userSteve

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