11

現在、Webアプリケーションで米ドルの値を作成するために以下を使用しています。

string.Format("{0:C0}", dollarValue );

この例では、dollarValueが145の場合、$145と表示されます。-145の場合、-$ 145ではなく($ 145)が表示されます。私たちにとって、dollarValueはdoubleですが、任意の数値タイプである可能性があることに注意してください。おもう。

とにかく、私が欲しいのはそれが$145か-$145のどちらかになることです。

さて、私の調査によれば、NumberFormatInfoクラスを使用してこれを行うことが可能かもしれません。使い方がわからず、有効な例も見つかりません。私はここでこの質問を見ました:通貨値が$ 0.00のときに「無料」を表示するカスタムNumberFormatInfoを作成するC#ですが、この質問からリンクされているMSDNの例は、私が実際にやりたいこととは少し異なるようです。

私は、次のことを行う必要があることを認識しています。

double dollarValue = -145d;
string myMoney = dollarValue.ToString( "C0", someIFormatProvider );

ここで、someIFormatProviderはNumberFormatInfoタイプである可能性があります。さて、私がやったことはこれです:

NumberFormatInfo ni = new NumberformatInfo();
ni.CurrencyNegativePattern = 1; // The value 1 should mean not to use parenthesis
string myMoney = dollarValue.ToString( "C0", ni );

...そして「インスタンスは読み取り専用」の例外が発生します。CurrencyNegativePatternプロパティの「ドキュメント」には、値を設定および取得できると記載されていますが、明らかにできません。また、NumberFormatInfoは封印されたクラスです。これに基づいて新しいクラスを簡単に作成し、値をオーバーライドすることはできません。

私はこれにどう対処するか途方に暮れています。今のところ、私の回避策は、負の値を無効にして、string.Format(...)もう一度実行するという正の結果を出すことです。はい、この前に負の符号がないことはわかっていますが、もちろん、必要に応じて結果の前に「-」を追加することで簡単に解決できます。

この状況でNumbefFormatInfoクラスを効果的に正しく使用する方法の実用的な例を誰かが私に提供することができますか?ありがとう。

4

6 に答える 6

12

NumberFormatでプロパティのクローンを作成できますCurrentCulture(これにより、アプリケーションをグローバル化する場合に正しい通貨記号を確実に保持できます)。その後、CurrencyNegativePatternプロパティを目的の値に設定し、次のようNumberFormatInfoに関数に渡します。double.ToString()

NumberFormatInfo noParens = (NumberFormatInfo)CultureInfo.CurrentCulture.NumberFormat.Clone();
noParens.CurrencyNegativePattern = 1;
double dollarValue = -145d;
string output = dollarValue.ToString("C0", noParens); // outputs -$145
于 2012-06-13T12:51:27.273 に答える
3

これを試して...

string.Format( "{0:$#.;-$#.}", -145 )

また

dollarValue.ToString("$#.;-$#.")
于 2012-06-13T12:38:04.963 に答える
2
double dollarValue = -145d;
 System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US");
 string mymoney = dollarValue.ToString("C", modCulture);
          MessageBox.Show(mymoney);

オペレーティングシステムの現在のカルチャがen-USの場合、次の行は必要ありません

System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US");

コードは次のようになります

double dollarValue = -145d;
string mymoney = dollarValue.ToString("C");

NumberFormatInfoを使用する場合

double dollarValue = -145d; 
System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US");
     NumberFormatInfo number = modCulture.NumberFormat;
     string mymoney = dollarValue.ToString("C", number);

別の方法

double dollarValue = -145d;
System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US");
NumberFormatInfo number = modCulture.NumberFormat;
string mymoney = dollarValue.ToString(String.Format("C",number));
Console.WriteLine(mymoney);
于 2012-06-13T12:41:56.820 に答える
2

「インスタンスは読み取り専用」は、の読み取り専用インスタンスがあることを意味しますNumberFormatInfo。読み取り専用インスタンスのクローンを作成することで、書き込み可能なインスタンスを取得できます。

NumberFormatInfo writeable = (NumberFormatInfo) ni.Clone();
于 2012-06-13T12:43:20.850 に答える
1

CurrencyNegativePattern を割り当てることはできませんか? 私はこのコードで試しました:

double dollarValue = -145d;
System.Globalization.NumberFormatInfo ni = new System.Globalization.NumberFormatInfo();
ni.CurrencyNegativePattern = 1;
dropDownList.Items.Add(new ListItem(dollarValue.ToString("C0", ni)));

そして成功です。

于 2012-06-13T12:43:52.963 に答える
1

あなたが「米国の文脈」にとどまるようにするために、私は次のようにします:

double val = -145d;
NumberFormatInfo nfi = new CultureInfo("en-US").NumberFormat;
nfi.CurrencyNegativePattern = 1;
val.ToString("C0", nfi).Dump();

は、結果としてDump表示される LinqPad から取得されます-$145

あなたが得ているエラーは、あなたが次のNumberFormatInfoようなものを手に入れたことに起因しているように感じます:

NumberFormatInfo nfi = Thread.CurrentThread.CurrentCulture.NumberFormat;

その場合、次のようなものに置き換えます。

NumberFormatInfo nfi = (NumberFormatInfo)Thread.CurrentThread.CurrentCulture.NumberFormat.Clone();
于 2012-06-13T12:51:32.237 に答える