4

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

在 Windows Store 下运行的相同代码会生成{50:C}.

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

现在 - 我也可以得到其中的一个,但是CurrencyFormatter还有另一个问题使它不适合货币格式化 - 你只能 formatdouble和types long-ulong没有decimal重载 - 在某些情况下会导致一些有趣的值错误。

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

4

1 回答 1

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

这给出了预期的结果。

于 2013-01-29T10:46:16.893 回答