如何获得特定文化的货币模式?如何获得特定文化货币模式
例如:
而不是使用:
string.Format("{0:c}", 345.10)
我想用这个。
string.Format("#.##0,00 €;-#.##0,00 €", 345.10);
但我如何获取模式字符串(如“### 0,00€; - #。## 0,00€“)我的应用程序需要每种文化?
我不能使用“{0:c}”模式,因为如果用户切换语言,货币应该是相同的。
如何获得特定文化的货币模式?如何获得特定文化货币模式
例如:
而不是使用:
string.Format("{0:c}", 345.10)
我想用这个。
string.Format("#.##0,00 €;-#.##0,00 €", 345.10);
但我如何获取模式字符串(如“### 0,00€; - #。## 0,00€“)我的应用程序需要每种文化?
我不能使用“{0:c}”模式,因为如果用户切换语言,货币应该是相同的。
A CultureInfo
包含一个NumberFormatInfo
,此类描述(除别的之外)如何为这种货币格式化特定的文化。
尤其是您可以使用CurrencyPositivePattern
和CurrencyNegativePattern
来确定货币符号是放在金额的前后,当然是CurrencySymbol
以获得正确的货币符号。所有这些信息都被使用。NET使用C
格式说明符时。
您可以在MSDN上了解有关NumberFormatInfo class的更多信息。
以下代码演示了正确格式化货币所需的一些步骤。它只使用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);
的下面试验说明了如何实现这一点:
[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));
}
通过使用标准十进制表示从当前选择的培养物,可以显示任何给定值跳过货币,这可以分别对待。
谢谢,但我不能使用这个解决方案,因为我使用DevExpress网格,这只接受字符串格式模式。 – naishx
我认为你可以专门使用{0:n}。查看以下信息:http://documentation.devexpress.com/#WindowsForms/CustomDocument2141 –
“{0:n}”格式使用_Number_格式,图书馆竭尽全力将其与_Currency_格式区分开来。而在一些重要的国家。 –
您需要格式化您的货币/双用:基于ISO代码
money.ToString("C", culture);
困难的部分实际上是获得正确的文化。我不知道你如何跟踪你需要的文化。请记住,这只是您的钱的格式,而不是转换为到不同的货币/文化!
更多细节:
ISOCurrencySymbol是RegionInfo,您可以创建基于CultureInfo的,你可以从当前线程的文化设置检索的一部分。您应该创建一个实现字典的单例,以从ISOCurrencyCode转换为CultureInfo。
我想你问的是如何更改货币符号,但保持文化特定的格式。
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
(对我来说):
NumberFormatInfo
的副本,并修改
CurrencySymbol
属性来完成这个
$$$345.10
快速和肮脏的方法是:
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;
在这种情况下,模式等于“#。## 0,00€; - #。## 0,00€”。这避免了很多头痛,试图找出所有的排列组合。我很感激被问到的问题,因为它帮助我强迫我找到更简单的答案。
这种方式,我试图。我是否需要实现一个开关来确定我自己使用的模式? CurrencyNegativePattern例如有15个选项。或者有没有办法获得字符串值而不是int数?编辑:你已经回答了。 – naishx