2

此代码:Console.Out.WriteLine(string.Format(CultureInfo.GetCultureInfo("hu-HU"), "{0:C}", 1234.56M))将产生以下输出:1 234,56 Ft,这在技术上是正确的,但它是如何猜测货币的呢?

这种行为意味着,只需将显示区域性从 hu-HU 更改为 en-US,该值将乘以 200 以上,具体取决于当前速率。你永远不会犯 500 福林兑换 500 美元的错误。明显的。

设置货币的唯一“好”方法是克隆所需的文化并设置货币符号:

var format = NumberFormatInfo.GetInstance(CultureInfo.GetCultureInfo("en-US")).Clone() as NumberFormatInfo;
format.CurrencySymbol = "asd";
Console.Out.WriteLine(string.Format(format, "{0:C}", 1234.56M));

这可以正常生产asd1,234.56,但非常麻烦。

我的问题是:

  1. 在我们生活了几十年的这个全球化世界中,违约国家货币的比例是多少?
  2. 为什么没有办法以更相关的方式指定金额和货币,因为它们如此耦合?
  3. 奖励:如果我将 sk-SK 用于文化,我会得到欧元作为“默认”货币。如果我更改为 Framework 2.0,我应该得到Sk(对于斯洛伐克克朗),因为在 2005 年它是本国货币。(嗯,它不会发生。但我没有在任何不迟于 2.0 的系统上尝试过。)

更新:结论:

  1. 文化中的违约货币对某些人来说是正常的,对其他人来说很奇怪(包括我)
  2. 没有“金额”类型,因为没有长度、重量等类型,限制在哪里?Virtlink 为此创建了一个库:M42 Financial
4

5 回答 5

4

我改变了主意:我同意你的观点,货币是文化的一部分很奇怪。

在.NET 和 Java 中用值指定单位并不常见。您通常不会用单位指定温度、距离或货币。对于大多数意图和目的,开发人员假定单位:米表示距离,摄氏度表示温度。.NET 中没有为给定区域性指定默认距离单位或温度单位。

为了保持一致,.NET Framework 也不应该将货币信息添加到文化中。大多数人处理不止一种货币,有些国家甚至接受多种货币。并非特定文化的每个人都会使用一种且仅一种货币。

.NET 框架包含一个System.Currency类,但它是隐藏的(内部),并且仅用于Decimal.ToOACurrency()方法。它也不是很实用。Java 包含一个Currency自 2002 年以来的类,但由于 .NET Framework 是在 2000 年创建的,并且许多设计错误都是从 Java 中复制而来的,这可能就是其中之一。但是,我找不到有关 JavaLocale类是否包含(或包含)任何货币信息的信息,而且我不是通灵者。

好吧,继续从 .NET 中从未指定单位的想法开始,并且不应该有文化的默认货币,那么他们应该将货币价值的货币单位放在哪里?当然,他们应该创建一个Currency类。

于 2013-03-04T14:32:25.183 回答
2

我只是认为这并不意味着在应用程序中可能出现多种货币时使用。当您有一个简单的应用程序将货币处理为必须以当地货币解释的数字时,它可能会很有用。

在所有其他情况下,请勿使用它。

我不认为有很多这样的应用程序是有意义的。

于 2013-03-04T14:37:35.850 回答
0

我不能说设计师在想什么,但他们的决定对我来说很有意义。要回答您的问题:

  1. 我们大多数人和我们的客户都使用单一货币,这取决于我们所居住的国家。默认为该文化的默认货币是有意义的。
  2. 货币符号和数字格式是单独设置的,因为在更改货币符号时,您很可能希望保留默认数字格式。例如,如果我(在美国)以英镑打印一个金额,我不希望数字格式改变——只是货币符号。如果我必须同时设置它们,我不仅要知道新的货币符号,还要知道我正在使用的特定数字格式。此外,如果将它们组合在一起,那么更改数字格式(对于非货币值)也需要我指定货币符号。除非你有两种完全不同的数字格式……这太疯狂了。
  3. 没有关于那个特定问题的答案。

简而言之,拥有两个单独的设置可以为您提供更大的灵活性并让事情变得简单。将事物结合起来会做更多的工作来单独改变事物。

于 2013-03-04T14:32:13.293 回答
0

为什么 .NET 货币格式包含货币符号?

因为它是一种货币格式。

于 2013-03-04T15:53:42.863 回答
-4

我不知道 .NET,但您的格式化程序是否允许您在格式字符串中省略“M”?

所以这个:1234.56而不是这个1234.56M

于 2013-03-04T14:24:20.677 回答