在以前的.Net生活中,我为当前语言格式化货币(任何货币)的方式是做这样的事情:
public string FormatCurrencyValue(string symbol, decimal val)
{
var format = (NumberFormatInfo)CultureInfo.CurrentUICulture.NumberFormat.Clone();
//overwrite the currency symbol with the one I want to display
format.CurrencySymbol = symbol;
//pass the format to ToString();
return val.ToString("{0:C2}", format);
}
这将返回货币值,没有任何小数部分,为给定的货币符号设置格式,根据当前文化进行调整 - 例如£50.00
为en-GB
,50,00£
为fr-FR
。
在Windows应用商店下运行的相同代码会生成{50:C}
。
查看(相当糟糕的)WinRT文档,我们确实有CurrencyFormatter类 - 但是只有在尝试使用"£"
作为参数触发构造函数并获得{{1}之后(WinRT文档非常特别 - 几乎没有关于异常的信息),我意识到它需要一个ISO货币符号(公平地说,参数名称是ArgumentException
,但即便如此)。
现在 - 我也可以获得其中一个,但currencyCode
有另一个问题,使其不适合进行货币格式化 - 您只能格式化CurrencyFormatter
,double
和{{ 1}}类型 - 没有long
重载 - 在某些情况下可能会产生一些有趣的值错误。
那么如何在WinRT.net中动态格式化货币?
答案 0 :(得分:2)
我发现你仍然可以使用NumberFormatInfo
类的旧式格式字符串 - 只是这样,莫名其妙地,当你使用ToString
时它不起作用。如果您使用String.Format
代替,那么它就有效。
因此我们可以将问题中的代码重写为:
public string FormatCurrencyValue(string symbol, decimal val)
{
var format = (NumberFormatInfo)CultureInfo.CurrentUICulture.NumberFormat.Clone();
//overwrite the currency symbol with the one I want to display
format.CurrencySymbol = symbol;
//pass the format to String.Format
return string.Format(format, "{0:C2}", val);
}
这给出了期望的结果。