货币格式 - Windows应用商店应用

时间:2013-01-29 10:46:17

标签: c# .net windows-runtime windows-store-apps

在以前的.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.00en-GB50,00£fr-FR

在Windows应用商店下运行的相同代码会生成{50:C}

查看(相当糟糕的)WinRT文档,我们确实有CurrencyFormatter类 - 但是只有在尝试使用"£"作为参数触发构造函数并获得{{1}之后(WinRT文档非常特别 - 几乎没有关于异常的信息),我意识到它需要一个ISO货币符号(公平地说,参数名称是ArgumentException,但即便如此)。

现在 - 我也可以获得其中一个,但currencyCode有另一个问题,使其不适合进行货币格式化 - 您只能格式化CurrencyFormatterdouble和{{ 1}}类型 - 没有long重载 - 在某些情况下可能会产生一些有趣的值错误。

那么如何在WinRT.net中动态格式化货币?

1 个答案:

答案 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);
}

这给出了期望的结果。