特定の文化の通貨パターンを取得するにはどうすればよいですか?
例えば:
代わりに:
string.Format("{0:c}", 345.10)
私はこれを使いたい:
string.Format("#.##0,00 €;-#.##0,00 €", 345.10);
しかし、どのように私のアプリケーションに必要な各文化のパターン文字列( "#。## 0,00€; - #。## 0,00€")を取得するには?
ユーザーが言語を切り替えると、通貨は同じでなければならないので、「{0:c}」パターンを使用することはできません。
回答:
答えは№1の20A CultureInfo
〜を含む NumberFormatInfo
このクラスは、(特に)特定の文化の通貨をフォーマットする方法について説明します。
特にあなたが使用することができます CurrencyPositivePattern
そして CurrencyNegativePattern
通貨記号が金額の前後に配置されているかどうかを判断する CurrencySymbol
正しい通貨記号を取得する。この情報はすべて、.NETによって使用されます。 C
書式指定子が使用されます。
詳細については、こちらをご覧ください。 NumberFormatInfoクラス MSDNで。
以下のコードは、適切に通貨をフォーマットするために必要な手順の一部を示しています。それは、 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);
回答№2の11
あなたが求めていることは、通貨記号を変更する方法ですが、文化固有の書式を保持することです。これは、現在の 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
回答№3の場合は3
すべての数値書式で機能する迅速で汚いアプローチは次のとおりです。
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€ "これは、すべての順列を解明しようとする頭痛を避けることができます。
答え№4の2
あなたは使ってみましたか? string.Format("{0:N2} €", 345.10)
?これは、ユーザーカルチャの小数点以下2桁にスペースとユーロ記号を続けてフォーマットする必要があります。
回答№5の場合は1
以下のテストは、これを達成する方法を示しています:
[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));
}
現在選択されているカルチャの標準10進表記を使用すると、通貨をスキップする任意の値を表示できます。これは個別に扱うことができます。
答え№6の場合は0
あなたは通貨/ダブルの書式を設定する必要があります:
money.ToString("C", culture);
難しい部分は実際にはISOコードに基づいた適切な文化を得ています。私はあなたが必要とする文化をどのように把握しているのか分かりません。これは単に 書式設定 あなたのお金の、ない 変換 異なる通貨/文化に!
より詳しく:
ISOCurrencySymbolはRegionInfoの一部です。現在のスレッドのカルチャ設定から取得できるCultureInfoに基づいて作成できます。ISOCurrencyCodeからCultureInfoに変換する辞書を実装するシングルトンを作成する必要があります。