web-dev-qa-db-ja.com

文字列形式の通貨

私はこの行を持っています

@String.Format("{0:C}", @price)

私のカミソリビューで。価格の前にドル記号を表示したいのですが、代わりにポンド記号を表示します。どうすればこれを達成できますか?

51
Sachin Kainth

問題は単に、リクエストを処理するスレッドの現在の文化が適切に設定されていないことだけだと強く思います。

リクエスト全体に設定するか、フォーマット中にカルチャを指定できます。どちらの方法でも、not複合フォーマットでstring.Formatを使用することをお勧めします。フォーマットするものが複数ある(または、より広いメッセージ)場合は別です。代わりに、私は使用します:

@price.ToString("C", culture)

それは単にそれをいくぶん単純にします。

編集:あなたのコメントを考えると、英国の文化を使用したいと思うかもしれませんとは関係なくユーザーの文化の。繰り返しになりますが、英国文化をリクエスト全体のスレッド文化として設定するか、「定数」を使用して独自のヘルパークラスを導入することもできます。

public static class Cultures
{
    public static readonly CultureInfo UnitedKingdom = 
        CultureInfo.GetCultureInfo("en-GB");
}

次に:

@price.ToString("C", Cultures.UnitedKingdom)

私の経験では、このような「名前付き」カルチャセットを使用すると、コードを使用してコードを読むのがかなり簡単になり、複数の場所で文字列を正しく取得する必要がなくなります。

74
Jon Skeet

他の人が言ったように、これはIFormatProviderを介して実現できます。ただし、通貨のフォーマットは通貨記号をはるかに超えていることに注意してください。たとえば、米国で正しくフォーマットされた価格は「$ 12.50」ですが、フランスでは「12,50 $」と記述されます(小数点は通貨記号の位置とは異なります)。通貨記号を変更するためだけに、この文化に適したフォーマットを失いたくありません。そして、このコードが示すように、良いニュースはありません。

var cultureInfo = Thread.CurrentThread.CurrentCulture;   // You can also hardcode the culture, e.g. var cultureInfo = new CultureInfo("fr-FR"), but then you lose culture-specific formatting such as decimal point (. or ,) or the position of the currency symbol (before or after)
var numberFormatInfo = (NumberFormatInfo)cultureInfo.NumberFormat.Clone();
numberFormatInfo.CurrencySymbol = "€"; // Replace with "$" or "£" or whatever you need

var price = 12.3m;
var formattedPrice = price.ToString("C", numberFormatInfo); // Output: "€ 12.30" if the CurrentCulture is "en-US", "12,30 €" if the CurrentCulture is "fr-FR".
40
Clafou

IFormatProviderを提供する必要があります。

@String.Format(new CultureInfo("en-US"), "{0:C}", @price)
29
dtb

個人的には、カルチャー固有のコードを使用することに反対しています。

@String.Format(CultureInfo.CurrentCulture, "{0:C}", @price)

あなたのweb.configで:

<system.web>
    <globalization culture="en-GB" uiCulture="en-US" />
</system.web>

追加情報: https://msdn.Microsoft.com/en-us/library/syy068tk(v = vs.90).aspx

11
Sam Jones

かみそりの場合は、文化、価値を使用できます

@String.Format(new CultureInfo("sv-SE"), @Model.value)
3
Luke Alderton
decimal value = 0.00M;
value = Convert.ToDecimal(12345.12345);
Console.WriteLine(".ToString(\"C\") Formates With Currency $ Sign");
Console.WriteLine(value.ToString("C"));
//OutPut : $12345.12
Console.WriteLine(value.ToString("C1"));
//OutPut : $12345.1
Console.WriteLine(value.ToString("C2"));
//OutPut : $12345.12
Console.WriteLine(value.ToString("C3"));
//OutPut : $12345.123
Console.WriteLine(value.ToString("C4"));
//OutPut : $12345.1234
Console.WriteLine(value.ToString("C5"));
//OutPut : $12345.12345
Console.WriteLine(value.ToString("C6"));
//OutPut : $12345.123450
Console.WriteLine();
Console.WriteLine(".ToString(\"F\") Formates With out Currency Sign");
Console.WriteLine(value.ToString("F"));
//OutPut : 12345.12
Console.WriteLine(value.ToString("F1"));
//OutPut : 12345.1
Console.WriteLine(value.ToString("F2"));
//OutPut : 12345.12
Console.WriteLine(value.ToString("F3"));
//OutPut : 12345.123
Console.WriteLine(value.ToString("F4"));
//OutPut : 12345.1234
Console.WriteLine(value.ToString("F5"));
//OutPut : 12345.12345
Console.WriteLine(value.ToString("F6"));
//OutPut : 12345.123450
Console.Read();

出力コンソール画面:

1
Bhanu Pratap

これを使用して、それが動作し、とても簡単です:

  var price=22.5m;
  Console.WriteLine(
     "the price: {0}",price.ToString("C", new System.Globalization.CultureInfo("en-US")));
0
Coder992

C#6.0文字列補間構文を使用している場合:例:$"The price is {price:C}"ドキュメント は、異なるCultureInfoを適用するいくつかの方法を提案します。

通貨を使用するように例を変更しました。

decimal price = 12345.67M;
FormattableString message = $"The price is {price:C}";

System.Globalization.CultureInfo.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo("nl-NL");
string messageInCurrentCulture = message.ToString();

var specificCulture = System.Globalization.CultureInfo.GetCultureInfo("en-IN");
string messageInSpecificCulture = message.ToString(specificCulture);

string messageInInvariantCulture = FormattableString.Invariant(message);

Console.WriteLine($"{System.Globalization.CultureInfo.CurrentCulture,-10} {messageInCurrentCulture}");
Console.WriteLine($"{specificCulture,-10} {messageInSpecificCulture}");
Console.WriteLine($"{"Invariant",-10} {messageInInvariantCulture}");
// Expected output is:
// nl-NL      The price is € 12.345,67
// en-IN      The price is ₹ 12,345.67
// Invariant  The price is ¤12,345.67
0
Andrew