此代码: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
,但是非常繁琐。
我的问题是:
Sk
(对于斯洛伐克克朗),因为在2005年它是本国货币。 (好吧,它不会发生。但我没有在任何不晚于2.0的系统上尝试过它。)更新: 结论:
答案 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)
我不能说设计师在想什么,但他们的决定对我来说很有意义。回答你的问题:
简而言之,拥有两个独立的设置可以提供更大的灵活性并保持简单。将事情结合起来可以做出更多改变事情的工作。
答案 3 :(得分:0)
为什么.NET货币格式包含货币符号?
因为它是货币格式。
答案 4 :(得分:-4)
我不知道.NET但你的格式化程序是否允许你在格式字符串中省略“M”?
所以:1234.56
代替此1234.56M