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

时间:2013-03-04 14:22:06

标签: .net localization currency

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

此行为意味着只需将显示文化从hu-HU更改为en-US,即可将该值乘以200以上,具体取决于当前的费率。你永远不会错误地收取500 HUF的500 HUF账单。明显。

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

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的系统上尝试过它。)
  4. 更新: 结论:

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

5 个答案:

答案 0 :(得分:4)

我改变主意:我同意你的看法,货币是文化的一部分,这很奇怪。

在.NET和Java中不常见来指定带有值的单位。您通常不指定单位的温度,距离或货币。对于大多数意图和目的,该单位由开发者承担:距离的米和温度的摄氏度。对于给定的文化,.NET中没有指定的默认距离单位或温度单位。

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

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

那么,继续认为单位从未在.NET中指定并且不应该是文化的默认货币,那么他们应该将货币单位放在哪里?当然,他们应该创建一个Currency课程。


快速搜索并没有改变任何资金库,所以作为一个实验,我创建了一个便携式图书馆,用于处理资金(包括其货币单位)。它的效果非常好。

您可以在此处下载:

  

M42 Financial - 用于处理货币和货币的便携式.NET库。

如果有人有任何建议或改进,请执行拉取请求或创建问题

答案 1 :(得分:2)

我只是认为当应用程序中可能出现多种货币时,不应使用此功能。当你有一个简单的应用程序处理货币时,它可能会很有用,就像必须用本地货币解释的数字一样。

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

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

答案 2 :(得分:0)

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

  1. 我们大多数人和我们的客户都使用单一货币,这取决于我们所居住的国家。默认为该文化的默认货币是有意义的。
  2. 货币符号和数字格式是单独设置的,因为在更改货币符号时,您很可能要保留默认数字格式。例如,如果我(在美国)以英镑打印金额,我不希望数字格式改变 - 只是货币符号。如果我必须同时设置它们,我不仅要知道新货币符号,还要知道我使用的具体数字格式。此外,如果它们组合在一起,那么更改数字格式(对于非货币值)也需要我指定货币符号。除非你有两个完全独立的数字格式......这只会是疯狂的。
  3. 对该特定问题没有答案。
  4. 简而言之,拥有两个独立的设置可以提供更大的灵活性并保持简单。将事情结合起来可以做出更多改变事情的工作。

答案 3 :(得分:0)

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

因为它是货币格式。

答案 4 :(得分:-4)

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

所以:1234.56代替此1234.56M