c# – 货币格式 – Windows应用商店应用

在以前的.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);
}

这将返回货币值,没有任何小数部分,为给定的货币符号格式化,根据当前文化进行调整 – 例如en-GB为50.00英镑,fr-FR为50,00英镑.

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

看看(相当糟糕的)WinRT文档,我们确实有CurrencyFormatter类 – 但是只有在尝试使用“£”作为参数触发构造函数并获得ArgumentException之后(WinRT文档非常特殊 – 它实际上没有关于异常的信息)我意识到它想要一个ISO货币符号(公平地说,参数名称是currencyCode,但即便如此).

现在 – 我也可以得到其中一个,但CurrencyFormatter有另一个问题,它使它不适合货币格式化 – 你只能格式化double,long和ulong类型 – 没有十进制重载 – 这可能会导致一些有趣的值错误一些情况.

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

最佳答案 我发现你仍然可以在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);
}

这给出了期望的结果.

点赞