如何获得特定的文化货币模式

nai*_*shx 21 c# string format currency

我如何获得特定文化的货币模式?

例如:

而不是使用:

string.Format("{0:c}", 345.10)
Run Code Online (Sandbox Code Playgroud)

我想用这个:

string.Format("#.##0,00 €;-#.##0,00 €", 345.10);
Run Code Online (Sandbox Code Playgroud)

但是我如何为我的应用程序需要的每种文化获得模式字符串(如"#.## 0,00€; - #.## 0,00€")?

我不能使用"{0:c}"模式,因为如果用户切换语言,则货币应该相同.

Mar*_*age 23

A CultureInfo包含a NumberFormatInfo和此类描述(除其他外)如何格式化该特定文化的货币.

特别是,您可以使用CurrencyPositivePatternCurrencyNegativePattern确定货币符号是在金额之前还是之后放置,当然CurrencySymbol也可以获得正确的货币符号.当使用C格式说明符时,.NET将使用所有这些信息.

您可以在MSDN上阅读有关NumberFormatInfo类的更多信息.

下面的代码演示了正确格式化货币所需的一些步骤.它只使用CurrencySymbol,CurrencyPositivePatternCurrencyDecimalDigits因而是不完整的:

var amount = 123.45M;
var cultureInfo = CultureInfo.GetCultureInfo("da-DK");

var numberFormat = cultureInfo.NumberFormat;
String formattedAmount = null;
if (amount >= Decimal.Zero) {
  String pattern = null;
  switch (numberFormat.CurrencyPositivePattern) {
    case 0:
      pattern = "{0}{1:N" + numberFormat.CurrencyDecimalDigits + "}";
      break;
    case 1:
      pattern = "{1:N" + numberFormat.CurrencyDecimalDigits + "}{0}";
      break;
    case 2:
      pattern = "{0} {1:N" + numberFormat.CurrencyDecimalDigits + "}";
      break;
    case 3:
      pattern = "{1:N" + numberFormat.CurrencyDecimalDigits + "} {0}";
      break;
  }
  formattedAmount = String.Format(cultureInfo, pattern, numberFormat.CurrencySymbol, amount);
}
else {
  // ...
}

Console.WriteLine(formattedAmount);
Run Code Online (Sandbox Code Playgroud)

当然你可以简单地使用:

var amount = 123.45M;
var cultureInfo = CultureInfo.GetCultureInfo("da-DK");
var formattedAmount = String.Format(cultureInfo, "{0:C}", amount);
Console.WriteLine(formattedAmount);
Run Code Online (Sandbox Code Playgroud)


por*_*ges 12

我想你要问的是如何更改货币符号但保留特定于文化的格式.您可以通过获取当前副本NumberFormatInfo并修改CurrencySymbol属性来执行此操作:

Thread.CurrentThread.CurrentCulture = new CultureInfo("de");
// pretend we are german

var nfi = (NumberFormatInfo)NumberFormatInfo.CurrentInfo.Clone();
nfi.CurrencySymbol = "$$$";
Console.WriteLine(string.Format(nfi,"{0:c}",345.10));
Run Code Online (Sandbox Code Playgroud)

这将输出:

345,10 $$$
Run Code Online (Sandbox Code Playgroud)

不改变CurrentCulture输出(对我来说):

$$$345.10
Run Code Online (Sandbox Code Playgroud)