24

これは簡単な問題のはずですが...

C# で表示 (文字列) 用に通貨をフォーマットする必要があります

問題の通貨には、使用する記号や、その記号を値の前 (例: $ 10) にするか後 (例: 10 ₫ はベトナム ドン) にするかなど、独自のルールがあります。

ただし、数値がどのようにフォーマットされるかは、通貨ではなく、ユーザーの地域によって異なります。

例えば

1.234,56 ₫ should be displayed to a user in Vietnam but 
1,234.56 ₫ should be displayed to a user in the US

(コードとしてフォーマットされているので、 と の違いを簡単に確認できます)。

だからコードのように

Double vietnamTotal = 1234.56;
return vietnamTotal.ToString("c");  

フォーマットと通貨にユーザー (またはより正確には CultureInfo.CurrentCulture) ロケールを使用するため、機能しません。しかし、間違った記号。

Double vietnamTotal = 1234.56;
CultureInfo ci = new CultureInfo(1066); // Vietnam
return vietnameTotal.ToString("c",ci)); 

1.234,56 ₫ - 正しい記号、間違った使い方 、および . 現在のユーザー向け。

この投稿では、正しいことについて詳しく説明していますが、その方法については説明していません。

フレームワークに隠されている明らかなメソッドは何ですか?

4

3 に答える 3

30
  • ユーザーのNumberFormatInfo通貨から を取得し、それを複製します
  • CurrencySymbolクローン形式の をCurrencySymbol問題の通貨の に設定します
  • 通貨位置 (およびフォーマットのその他の側面) をコピーしたい場合は、同じ方法で設定CurrencyPositivePatternします。CurrencyNegativePattern
  • 結果を使用してフォーマットします。

例えば:

using System;
using System.Globalization;

class Test
{    
    static void Main()
    {
        decimal total = 1234.56m;
        CultureInfo vietnam = new CultureInfo(1066);
        CultureInfo usa = new CultureInfo("en-US");

        NumberFormatInfo nfi = usa.NumberFormat;
        nfi = (NumberFormatInfo) nfi.Clone();
        NumberFormatInfo vnfi = vietnam.NumberFormat;
        nfi.CurrencySymbol = vnfi.CurrencySymbol;
        nfi.CurrencyNegativePattern = vnfi.CurrencyNegativePattern;
        nfi.CurrencyPositivePattern = vnfi.CurrencyPositivePattern;

        Console.WriteLine(total.ToString("c", nfi));
    }
}

確かに、私のコンソールは正しいシンボルを表示できませんが、それはフォントの問題によるものだと確信しています:)

于 2009-07-01T20:44:22.537 に答える
1

申し訳ありませんが、ここでは少し遅いかもしれませんが、まだあなたの主張がわかりません. 元の質問は、「ベトナムではベトナムの通貨形式で「₫」記号で表示したいドンの値があり、米国では米国の通貨形式で表示したい」のようです。しかし、まだ「₫」が付いています。」.

2 つの矛盾したステートメントに混乱していると思います... 「問題の通貨には独自のルールがあります」「数値のフォーマット方法は、通貨ではなく、ユーザーのローカル [sic] に依存します」。

変更したいのが通貨記号だけで、現在のカルチャに従って書式設定を残す場合、nfi を複製して記号を設定するだけで十分ではないでしょうか?

     NumberFormatInfo nfi;

     // pretend we're in Vietnam
     Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("vi-VN");

     nfi = CultureInfo.CurrentCulture.NumberFormat.Clone() as NumberFormatInfo;
     nfi.CurrencySymbol = "₫";

     String s1 = (1234.5678).ToString("c", nfi);

     // pretend we're in America
     Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");

     nfi = CultureInfo.CurrentCulture.NumberFormat.Clone() as NumberFormatInfo;
     nfi.CurrencySymbol = "₫";

     String s2 = (1234.5678).ToString("c", nfi);
于 2011-11-11T13:33:01.653 に答える