货币格式化 - Windows Store 应用程序

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

该函数返回给定货币符号格式化的货币值,不包含任何小数部分,并根据当前文化进行调整 - 例如,在en-GB中为£50.00,但在fr-FR中为50,00£

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

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

现在 - 我也可以获取其中之一,但是CurrencyFormatter还有另一个问题,使其不适用于货币格式 - 您只能格式化doublelongulong类型 - 没有decimal重载 - 这可能导致某些情况下出现一些有趣的值错误。

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


2
所以我不是唯一一个认为名为CurrencyFormatter的东西应该接受十进制参数的人。 - James McLachlan
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);
}

这将得到所需的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接