为什么.NET货币格式包含货币符号?
此代码:Console.Out.WriteLine(string.Format(CultureInfo.GetCultureInfo("hu-HU"), "{0:C}", 1234.56M))
将产生以下输出:1 234,56英尺,这在技术上是正确的,但它是如何猜测货币?为什么.NET货币格式包含货币符号?
这种行为意味着只要将显示文化从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
,但这么多繁琐。
我的问题是:
- 什么是落后于这个全球化的世界,我们一直生活在几十年默认为一个国家货币的比例是多少?
- 为什么没有办法以更相关的方式指定金额和货币,因为它们如此耦合?
- 奖励:如果我使用sk-SK进行文化交流,我会获得“默认”货币的欧元。如果我更改为Framework 2.0,自2005年以来它应该是
Sk
(对于斯洛伐克克朗),它是本国货币。 (当然,这不会发生,但我还没有尝试过有不迟于2.0的任何系统上。)
UPDATE: 结论:
- 从文化违约货币是一切正常对于其他人(包括我)
- 没有“金额”类型,因为没有长度,重量等类型,限额在哪里? Virtlink为此创建了一个库:M42 Financial
我改变了主意:我同意你的看法,货币是文化的一部分是很奇怪的。
这是不常用在.NET和Java中指定具有值的单位。您通常不会指定温度,距离或货币单位。对于大多数意图和目的,设备由开发人员承担:米为距离,摄氏为温度。对于给定的文化,.NET没有默认的距离单位或温度单位。
为了保持一致,.NET Framework不应该将货币信息添加到文化中。大多数人处理多种货币,有些国家甚至接受多种货币。并非所有文化中的每个人都会使用一种货币。
.NET框架包含一个System.Currency
类,但它是隐藏的(内部),并且仅用于Decimal.ToOACurrency()
方法。它也不是很有用。自2002年以来,Java包含一个Currency
类,但由于.NET Framework是在2000年创建的,许多设计错误都是从Java复制的,所以这可能就是其中之一。但是,我找不到有关Java类是否包含(或包含)任何货币信息的信息,而且我也不是通灵。
那么,从单位从未在.NET中指定且不应该是文化的默认货币的观点来看,那么他们应该在哪里放置货币单位的货币价值呢?当然,他们应该创建一个Currency
类。
快速搜索并没有把任何钱库了,这样一个实验,我创建了一个可移植的库与钱而工作(包括它的货币单位)。它工作得非常好。
您可以在这里下载:
M42 Financial - 便携式.NET库与钱和货币工作。
如果任何人有任何建议或改进,做一个拉请求或创建一个问题。
......这些都是数字格式化的有效点。但如何猜测这个货币呢? – 2013-03-04 14:33:52
你的例子在格式和内容上都有所不同。一万欧元与一万美元非常不同,无论他们展示的是哪种文化。我错过了格式和内容之间的明显区别。货币是内容,而不是格式。 (虽然是货币符号IS格式的位置) – 2013-03-04 14:38:25
@StefanSteinegger货币符号位于指定文化的文化信息类中。 – Magnus 2013-03-04 14:40:47
我不知道.NET,但是您的格式化程序是否允许您在格式字符串中忽略“M”?
所以这个:1234.56
代替本1234.56M
文字类型对格式没有影响。我尝试过不同的类型(M,D,甚至L)。 – 2013-03-04 14:26:38
这不是一个格式符号。 – 2013-03-04 14:27:38
'M'只是为了声明一个十进制常量,而不是一个double。我不认为小数的格式不同。 – 2013-03-04 14:28:38
我不能说什么,设计师们想什么,但他们的决策做好了意义。回答您的问题:
- 我们大多数人和我们的客户处理一种货币,这取决于我们生活的国家。默认为该文化的默认货币是合理的。
- 货币符号和数字格式是单独设置的,因为很可能在更改货币符号时要保留默认数字格式。例如,如果我(在美国)以英镑打印金额,我不希望数字格式改变 - 只是货币符号。如果我必须将它们都设置好,我不仅要知道新货币符号,还要知道我使用的具体数字格式。另外,如果它们合并,那么更改数字格式(对于非货币值)也需要我指定货币符号。除非你有两个完全独立的数字格式......这只会是疯狂的。
- 对这个问题没有答案。
简而言之,拥有两个独立的设置为您提供了更大的灵活性并使事情变得简单。将事情结合起来可以使更多的工作单独改变事物。
使用内置货币处理功能,en-US应用程序不会显示英镑。我需要用$符号以美国格式显示它们,使用问题中的clone()技术或实现我自己的货币格式。 – thelem 2014-08-04 14:16:07
我只是认为这并不意味着当多种货币可能出现在应用程序中时使用。当你有一个简单的应用程序来处理货币时,它可能是有用的,就像必须用当地货币解释的数字一样。
在所有其他情况下,请勿使用它。
我不认为有很多这样的应用程序是有道理的。
为什么.NET货币格式包含货币符号?
因为它是一种货币格式。
所以你的意思是,如果五英镑或五欧元不重要,这只是一个演示问题。 – 2013-03-04 21:16:26
真的,你期望单独的货币是一个数据类型,你不能将欧元添加到美元。英镑和千克怎么样? 2008年1月1日和2008年1月1日哪些日子呢?停止的地方 - SQL是否有欧元和美元的数据类型? – Paparazzi 2013-03-04 22:14:32
你说得对。正如上面@Virtlink指出的那样,尺寸或单位很少被封装。 – 2013-03-05 13:57:24
它显示它,因为你问它。如果你不需要,只需使用另一种格式说明符。像“N2”一样。 – 2013-03-04 14:27:40
您正在混淆数据的格式。如果您以错误的汇率或错误的货币进行汇票,而这不是格式问题。 – Paparazzi 2013-03-04 14:32:17
虽然这是根据计算器规则的“非建设性”问题之一,但这是一个非常有趣的问题。 – 2013-03-04 14:34:34