我注意到在使用框架函数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
类中的小数位数,但问题是,为什么这种情况发生在一些货币而不是其他货币?预计某些货币默认为四舍五入?
答案 0 :(得分:11)
来自The Currency "C"
Format Specifier
如果省略精度说明符,则默认精度为 由
CurrencyDecimalDigits
属性定义。
这个ms-MY
文化有0
作为CurrencyDecimalDigits
属性。这就是为什么它在结果中没有任何小数位。
作为解决方案,您可以使用精度说明符;
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仙。
截至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
这张图片对于告诉你有用,可以将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.CurrencyDecimalDigits
(https://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.currencydecimaldigits(v=vs.110).aspx)
ms-MY
文化中的,默认情况下此CurrencyDecimalDigits
为零,这会导致数字被舍入。
在sv-SE
等其他文化中,CurrencyDecimalDigits
为2
,显示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上的文化数据。
由于