2009-06-26 18 views
47

せずに私は、テキストボックスに私にこのようにフォーマットする必要がバランスを示す文字列値を養う:通貨などのフォーマットdouble値が、通貨記号(C#の)

###,###,###,##0.00 

私はvalue.ToStringを使用することができます( "c")が、通貨記号をその前に置くことになります。

上記の書式設定を達成するために、テキストボックスに入力する前に、どのように文字列を操作するか考えてみましょうか?

私は成功せず、これを試してみました:通貨の書式が正確に何をしたいあなたを与える場合は、とNumberFormatInfoのクローンを作成し、「」にCurrencySymbolプロパティを設定し

String.Format("###,###,###,##0.00", currentBalance); 

多くのおかげで、

答えて

50
string forDisplay = currentBalance.ToString("N2"); 
+10

文化の通貨のマイナス記号が()で小数点のマイナス記号が - の場合、通貨の表記は正しくありません –

+2

@Bob:これは受け入れられます"通貨のようなフォーマットで通貨記号がない"ためのビルトインフォーマット指定子がないので、そのような状況で何らかの手作業による処理が必要になるでしょう:*(1) *カスタムフォーマット文字列を使用するか、*(3)* ToString( "c")を呼び出して、シンボルを削除するために後処理する – LukeH

+0

@ Jonの答えに従ってカスタムのNumberFormatInfoを使用する* LukeH:これは受け入れられた答えですがそれがNumberFormatInfoによって提供される通貨書式を使用するという意味で、Jon Skeetが提供する答えはより正確です。 –

58

を。もちろん、負の数値も処理することを確認する必要があります。例えば

using System; 
using System.Globalization; 

class Test 
{ 
    static void Main() 
    { 
     NumberFormatInfo nfi = CultureInfo.CurrentCulture.NumberFormat; 
     nfi = (NumberFormatInfo) nfi.Clone(); 

     Console.WriteLine(string.Format(nfi, "{0:c}", 123.45m)); 
     nfi.CurrencySymbol = ""; 
     Console.WriteLine(string.Format(nfi, "{0:c}", 123.45m)); 
    } 
} 

他のオプションはもちろんのカスタム数値書式文字列を使用することです - それはあなたが本当に通貨はちょうど記号なし、見える正確にどのようにミラー化するかどうかによって異なり、またはコントロール数字の正確な位置。

+0

これは完璧に動作します。通貨を現在のカルチャーとしてフォーマットしたいが、シンボルなしの場合は、これが最善の解決策であるように思われる。 –

+1

トリム()を結果に追加して、先行するスペースがないことを確認することもできます。 –

+1

@BenjaminWegman:文化に敏感な通貨フォーマットに空白が含まれていれば、それは何らかの正当な理由があると思います。 –

7

あなたが試みた:

currentBalance.ToString("#,##0.00"); 

をこれが長い手のと等価である:

currentBalance.ToString("N2"); 
2
CultureInfo cultureInfo = new CultureInfo("en-US"); 
cultureInfo.NumberFormat.CurrencySymbol = "Rs."; 

Thread.CurrentThread.CurrentCulture = cultureInfo; 
decimal devimalValue = 3.45M; 
this.Text = devimalValue.ToString("C2"); //Rs.3.45 
5

ストリング結果= String.Formatの( "{0:N2} "、値); // ### ### ##のような結果のために##

3

あなたはこのように、the group separatorthe section separatorでこれを行うことができます。文化はからの回答のように差異のために

currentBalance.ToString("#,0.00;(#,0.00)"); 

これは考慮していません。 @JonSkeetはそうですが、これはen-US文化通貨フォーマットが単一のカスタム書式文字列を使用して生成する小数点以下の桁数、丸め、千単位の分離、および負の数の処理をまねします。

.NET Fiddle Demo

0

これはやりすぎかもしれないが、それは、フォーマットを丸め...

@helper TwoDecimalPlaces(decimal? val) 
{ 
    decimal x = 0; 
    decimal y = 0; 
    string clas = "text-danger"; 
    if (val.HasValue) 
    { 
     x = (decimal)val; 
     if (val > 0) 
     { 
      clas = ""; 
     } 
    } 
    y = System.Math.Round(x, 2); 
    IFormatProvider formatProvider = new System.Globalization.CultureInfo(string.Empty); 
    <span class="@clas">@string.Format("{0:N2}", y)</span> 
} 
0

この簡単な解決策は、米国の通貨との私のために動作します。

国際通貨サポートの使用にこれを必要とし、除去するために通貨記号(S)と$を交換しない場合:

// for USD 
string result = currentBalance.ToString("C").Replace("$", "") 

または

// for EUR 
string result = currentBalance.ToString("C").Replace("€", "")