为什么有些文化默认围绕货币小数?

时间:2015-08-17 08:31:35

标签: c# .net culture string.format

我注意到在使用框架函数string.Format格式化货币值时,在某些文化中,此函数默认会舍入小数。例如,在使用马来西亚林吉特时:

CultureInfo culture = new CultureInfo("ms-MY");
someLabel.Content = string.Format(culture,"{0:C}", 1.64m);
  

输出:RM2

但是,当使用其他货币(如美元,欧元或其他货币)时,您会获得原始值,例如:

CultureInfo culture = new CultureInfo("sv-SE");
someLabel.Content = string.Format(culture,"{0:C}", 1.64m);
  

输出:1.64kr

我知道我可以指定CultureInfo类中的小数位数,但问题是,为什么这种情况发生在一些货币而不是其他货币?预计某些货币默认为四舍五入?

2 个答案:

答案 0 :(得分:11)

来自The Currency "C" Format Specifier

  

如果省略精度说明符,则默认精度为   由CurrencyDecimalDigits属性定义。

这个ms-MY文化有0作为CurrencyDecimalDigits属性。这就是为什么它在结果中没有任何小数位。

enter image description here

作为解决方案,您可以使用精度说明符;

CultureInfo culture = new CultureInfo("ms-MY");
someLabel.Content = string.Format(culture,"{0:C2}", 1.64m); // RM1.64
  

为什么某些货币被舍入(或者他们将此属性设置为0,   如果你愿意,但不是其他人。那有什么规则吗?

老实说,我不知道。但是我做了一些研究,在这里我找到了什么;

马来西亚使用ringgit作为货币。它分为100仙。用它third series,只有4个硬币; 5仙,10仙,20仙,50仙。

previous (second) series;

  

截至2008年4月1日,rounding mechanism的价格为最接近的5   仅适用于总账单的sen已经生效,这是第一次   马来西亚国家银行于2007年宣布,试图提出   1 sen硬币无关紧要。

文章:http://www.thestar.com.my/story/?file=%2f2007%2f11%2f14%2fnation%2f19460993&sec=nation&focus=1

How it works

这张图片对于告诉你有用,可以将RM除以100,因为它没有意义。顺便说一句,我不得不说这个0值与指定货币指示符的ISO 4217不匹配。从Active Codes section开始,您可以看到此MYR在此标准中有2个小数位。

XML file from currency-iso.org也说明了这一点;

<CcyNtry>
  <CtryNm>MALAYSIA</CtryNm>
  <CcyNm>Malaysian Ringgit</CcyNm>
  <Ccy>MYR</Ccy>
  <CcyNbr>458</CcyNbr>
  <CcyMnrUnts>2</CcyMnrUnts>
</CcyNtry>

同样来自非十进制货币页面中的Contemporary non-decimal currencies部分;

  

今天,世界上只有两个国家使用非十进制货币。都   在非洲。这些是毛里塔尼亚(1 ouguiya = 5 khoums)和   马达加斯加(1 ariary = 5 iraimbilanja)。 然而这些只是   理论上非十进制,因为在两种情况下都是主单位的值   如此之低,以至于子单元太小而无法实际使用   并且不再使用子单元的硬币

顺便查看本页的其他部分,确实有相关信息。

在我看来,这有点复杂。我也连接到.NET Team。当我得到他们的反馈时,我会更新这个答案。

2015年8月18日更新

作为Tarek mentioned,此CurrencyDecimalDigits文化的my-MY属性在Windows 10中更改为2

Shawn Steele(Windows和.NET Framework全球化API专家)建议为;

  

可能使用Windows.Globalization和。格式化货币   按货币做这可能是一个更好的主意。

更新2016年2月21日

在Windows Server 2012 R2上再次发生这种情况。我已经与.NET团队联系,他们会回复,因为我们可以使用Locale Builder创建新的自定义文化或编辑现有文化,将此ICURRDIGITS设置更改为2

答案 1 :(得分:0)

小数位数由NumberFormatInfo.CurrencyDecimalDigitshttps://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.currencydecimaldigits(v=vs.110).aspx

控制 在ms-MY文化中的

,默认情况下此CurrencyDecimalDigits为零,这会导致数字被舍入。 在sv-SE等其他文化中,CurrencyDecimalDigits2,显示1,64

您可以通过指定{0:C2}来控制,也可以更改NumberFormatInfo上的值,如:

CultureInfo culture = new CultureInfo("ms-MY");
NumberFormatInfo nfi = (NumberFormatInfo)culture.NumberFormat.Clone();
nfi.CurrencyDecimalDigits = 2;
content = string.Format(nfi, "{0:C}", 1.64m);

如果您认为CurrencyDecimalDigits的{​​{1}}不应为零,我们可以将此反馈传递给Windows团队,因为他们控制Windows上的文化数据。

由于