如何获得特定的文化货币模式
本文关键字:文化 货币 模式 何获得 | 更新日期: 2023-09-27 18:04:26
如何获得特定文化的货币模式?
例如:而不是使用:
string.Format("{0:c}", 345.10)
我想用这个:
string.Format("#.##0,00 €;-#.##0,00 €", 345.10);
但是我如何获得模式字符串(如"#")。# # 0 00€;——#。## 000€"),我的应用程序需要的每个文化?
我不能使用"{0:c}"模式,因为如果用户切换语言,货币应该是相同的。
CultureInfo
包含NumberFormatInfo
,这个类描述(除其他事项外)如何为特定的区域性设置货币格式。
特别是,您可以使用CurrencyPositivePattern
和CurrencyNegativePattern
来确定货币符号是否放在金额之前或之后,当然CurrencySymbol
可以获得正确的货币符号。当使用C
格式说明符时,所有这些信息都由。net使用。
你可以在MSDN上阅读更多关于NumberFormatInfo类的信息。
下面的代码演示了正确格式化货币所需的一些步骤。它只使用CurrencySymbol
, CurrencyPositivePattern
和CurrencyDecimalDigits
,因此是不完整的:
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);
当然你可以简单地使用:
var amount = 123.45M;
var cultureInfo = CultureInfo.GetCultureInfo("da-DK");
var formattedAmount = String.Format(cultureInfo, "{0:C}", amount);
Console.WriteLine(formattedAmount);
我想你问的是如何改变货币符号,但保持特定文化的格式。您可以通过获取当前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));
这将输出:
345,10 $$$
不改变CurrentCulture
它输出(对我来说):
$$$345.10
您需要使用:
money.ToString("C", culture);
困难的部分实际上是基于ISO代码获得正确的文化。我不知道你是如何了解你所需要的文化的。请记住,这只是格式化您的钱的,而不是转换到不同的货币/文化!
更多细节:
ISOCurrencySymbol是RegionInfo的一部分,你可以在CultureInfo的基础上创建,你可以从当前线程的文化设置中检索。你应该创建一个单例,它实现了从iscurrencycode到CultureInfo的字典转换。
适用于所有数字格式的快捷方法是:
var culture = CultureInfo.GetCultureInfo("el-GR");
var numberFormat = (NumberFormatInfo)culture.NumberFormat.Clone();
numberFormat.CurrencySymbol = "€"; // Force the currency symbol regardless of culture
var specifier = "C"; // Or any other format specifier
var positivePattern = 1110.ToString(specifier, numberFormat).Replace('1', '#');
var negativePattern = (-1110).ToString(specifier, numberFormat).Replace('1', '#');
var pattern = positivePattern + ";" + negativePattern;
在本例中,pattern = "# "。# # 0 00€;——#。# # 0 00€"。这就避免了计算所有排列的麻烦。我很感谢你的提问,因为它帮助并迫使我找到一个更容易的答案。
你试过使用string.Format("{0:N2} €", 345.10)
吗?这应该格式化为用户区域性中的2位小数,后跟一个空格和欧元符号。
下面的测试说明了如何实现这一点:
[Test]
public void DisplayEurosInGreeceAndEngland()
{
var val = 125.22m;
Thread.CurrentThread.CurrentCulture
= Thread.CurrentThread.CurrentUICulture
= new CultureInfo("el-GR");
Console.WriteLine(string.Format("{0:n} €", val));
Thread.CurrentThread.CurrentCulture
= Thread.CurrentThread.CurrentUICulture
= new CultureInfo("en-GB");
Console.WriteLine(string.Format("{0:n} €", val));
}
通过使用当前选定区域性的标准十进制表示法,可以显示跳过货币的任何给定值,可以单独处理。
对于正数和负数,可以使用下面的代码片段进行区域性
class Program
{
static void Main(string[] args)
{
List<string> cultures = new List<string> { "ca-ES", "co-FR", "cs-CZ", "cy-GB", "da-DK", "de-AT", "de-CH", "de-DE", "de-LI", "de-LU", "dsb-DE", "en-US", "en-GB" };
var amount = -16.34M;
foreach (var c in cultures)
{
var cultureInfo = CultureInfo.GetCultureInfo(c);
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 if (amount < Decimal.Zero)
{
String pattern = null;
switch (numberFormat.CurrencyNegativePattern)
{
case 0:
pattern = "({0}{1:N" + numberFormat.CurrencyDecimalDigits + "})";
break;
case 1:
pattern = numberFormat.NegativeSign + "{0}{1:N" + numberFormat.CurrencyDecimalDigits + "}";
break;
case 2:
pattern = "{0}" + numberFormat.NegativeSign + "{1:N" + numberFormat.CurrencyDecimalDigits + "}";
break;
case 3:
pattern = "{0}{1:N" + numberFormat.CurrencyDecimalDigits + "}" + numberFormat.NegativeSign;
break;
case 4:
pattern = "({1:N" + numberFormat.CurrencyDecimalDigits + "}{0})";
break;
case 5:
pattern = numberFormat.NegativeSign + "{1:N" + numberFormat.CurrencyDecimalDigits + "}{0}";
break;
case 6:
pattern = "{1:N" + numberFormat.CurrencyDecimalDigits + "}" + numberFormat.NegativeSign + "{0}";
break;
case 7:
pattern = "{1:N" + numberFormat.CurrencyDecimalDigits + "}{0}" + numberFormat.NegativeSign;
break;
case 8:
pattern = numberFormat.NegativeSign + "{1:N" + numberFormat.CurrencyDecimalDigits + "} {0}";
break;
case 9:
pattern = numberFormat.NegativeSign + "{0} {1:N" + numberFormat.CurrencyDecimalDigits + "}";
break;
case 10:
pattern = "{1:N" + numberFormat.CurrencyDecimalDigits + "} {0}" + numberFormat.NegativeSign;
break;
case 11:
pattern = "{0} {1:N" + numberFormat.CurrencyDecimalDigits + "}" + numberFormat.NegativeSign;
break;
case 12:
pattern = "{0}" + " " + numberFormat.NegativeSign + "{1:N" + numberFormat.CurrencyDecimalDigits + "}";
break;
case 13:
pattern = "{1:N" + numberFormat.CurrencyDecimalDigits + "}" + numberFormat.NegativeSign + " " + "{0}";
break;
case 14:
pattern = "({0} {1:N" + numberFormat.CurrencyDecimalDigits + "})";
break;
case 15:
pattern = "({1:N" + numberFormat.CurrencyDecimalDigits + "} {0})";
break;
}
formattedAmount = String.Format(cultureInfo, pattern, numberFormat.CurrencySymbol, amount * -1);
}
Console.WriteLine(formattedAmount);
}
Console.ReadKey();
}
}