【问题标题】:Why does .NET currency format include a currency symbol?为什么 .NET 货币格式包含货币符号?
【发布时间】:2013-03-04 14:22:06
【问题描述】:

此代码: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

【问题讨论】:

  • 它显示它是因为您要求它。如果您不想要它,只需使用另一个格式说明符。像“N2”。
  • 您将格式与数据混淆了。如果您以错误的汇率或货币计费,这不是格式问题。
  • 虽然根据stackoverflow的规则这是“非建设性”问题之一,但这是一个非常有趣的问题。

标签: .net localization currency


【解决方案1】:

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

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

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

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

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

【讨论】:

  • ... 这些都是数字格式的有效点。但是货币怎么猜呢?
  • 您的示例在格式和内容上都各不相同。一万欧元与一万美元有很大不同,无论它们以何种文化显示。我错过了格式和内容之间的明显区别。货币是内容,而不是格式。 (不过,货币符号的位置是 IS 格式。)
  • @StefanSteinegger 货币符号在指定文化的文化信息类中。
  • 你的结构是自然的方式,它应该是一个系统类型的 IMO。此外,货币字段应该是包含所有信息的特定货币类型,如符号、3 字母代码、排序名称、长名称等。
  • 接受尊重您的工作。我想,不会有真正的答案:)
【解决方案2】:

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

在所有其他情况下,不要使用它。

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

【讨论】:

    【解决方案3】:

    我无法说出设计师的想法,但他们的决定对我来说很有意义。回答您的问题:

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

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

    【讨论】:

    • 使用内置的货币处理功能,对于 en-US 应用程序来说显示英镑并不是一个好方法。我要么需要以带有 $ 符号的美国格式显示它们,要么使用问题中的 clone() 技术,或者实现我自己的货币格式。
    【解决方案4】:

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

    因为它是一种货币格式。

    【讨论】:

    • 所以你的意思是五英镑或五欧元都没有关系,这只是一个演示问题。
    • 您确实希望单独的货币是一种数据类型,因此您不能将欧元添加到美元中。磅和公斤呢? 2008 年 1 月 1 日和 2008 年 1 月 1 日怎么样?它们是同一日期吗?停止在哪里 - SQL 应该有欧元和美元的数据类型吗?
    • 你说得对。正如@Virtlink 上面指出的那样,维度或单位很少用数量封装。
    • OK en-US 和 en-GB。 msdn.microsoft.com/en-us/library/… 该列表中的哪些文化会产生错误的货币符号?如果是这样,那么您可以将其作为错误报告给 MSFT。
    • 看看我的“奖励”问题:.NET Framework 2.0 对 sk-SK 有什么作用?在 2005 年,它显然是本国货币。当斯洛伐克有欧元时,为 .NET2.0 编写的程序现在可能表现得很奇怪。
    【解决方案5】:

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

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

    【讨论】:

    • 文字类型对格式没有影响。我用不同的类型(M、D、甚至 L)尝试过。
    • M 只是声明一个十进制常量,而不是双精度。我不认为小数的格式不同。
    • 明白了。这只是一个想法。
    • 包含 M 非常重要,否则您将从绝对精度的十进制类型切换到可变精度的双精度类型。可变精度类型只是一个近似值,因此您可能会发现无缘无故地从您的值中添加或删除便士/美分。
    猜你喜欢
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 2015-10-24
    • 1970-01-01
    • 2022-06-20
    • 2012-01-22
    相关资源
    最近更新 更多