2009-07-24 18 views
2

10進数を通貨として書式設定する必要がありますが、処理中に丸めが発生することはありません。このアプリケーションのすべてのユーザーを想定し丸めなしの書式通貨

Dim money = 1234.556789D 
money.ToString("C") ' Yields $1,234.56 (notice the rounding & truncating) 

money.ToString("C99") ' Yields $1,234.556789000000000000....0 -- close but not perfect, those trailing zeros are unwanted. 

' I want something that would result in this... 
money.ToString("??") ' Yields $1,234.56789 

' likewise.... 
money = 0.1D 
money.ToString("??") ' Yields $0.10 (notice that it at least matches the culture's currency format -- two decimal places) 

がen_USのルールを使用してされるだろう。例えば

(EN-US例の文化がある)私が作ることができるという「??」 "$#、## 0.00 ################################################## ############ " - それは私の胃を解体させます。 内蔵ですか私は後に何を達成する方法はありますか?

+1

私は約20分間ヘルプドキュメントを見てきましたが、何も見つかりませんでした。ごめんなさい。 – Greg

+0

グレッグに感謝します。申し訳ありませんが、あなたは(そして私の)手を空にしてしまいました。私はこのような必要性を持つことはあまり「普通」ではないと考えています。これはフレームワークが自然にこの機能を果たさないことを意味します。ああ、以下に述べるように、私はMicrosoftがそれをフレームワークに正しく焼き付けるのに驚くほど便利だと思うようになるまで私自身のソリューションを展開した;) – ckittel

答えて

1

ビルトインこれを行う方法があるように思われないことを見て、私がどのように見える自分自身の拡張メソッドを転がり終わった...

Public Function ToUnroundedCurrency(ByVal value As Decimal) As String 
    Dim valueAsString As String = value.ToString() ' Some loss of precision happens here, but it is not a concern. 

    Dim decimalLocation As Integer = valueAsString.IndexOf(".") 

    ' Get number of digits after the decimal place in the number 
    Dim numberOfDecimalPlaces As Integer = 0 
    If (decimalLocation > 0) Then numberOfDecimalPlaces = valueAsString.Length - decimalLocation - 1 

    ' The currency formatter has a limit of 99 decimal places -- due to the decimal -> ToString() conversion above, this will never happen, but being defensive anyway. 
    If (numberOfDecimalPlaces > 99) Then 
     numberOfDecimalPlaces = 99 
    ElseIf (numberOfDecimalPlaces < CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalDigits) Then 
     ' also make sure we at least have the minimum required decimal places 
     numberOfDecimalPlaces = CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalDigits 
    End If 

    Return value.ToString("C" & numberOfDecimalPlaces) 
End Function 

私はいくつかの無視できる程度の損失を指摘精度の私たち(あるいはおそらく誰か)は限界に遭遇するのに十分な小数点以下の値を扱っていません。

0

はい。ここでは別のフォーラムからの答えだ:

http://forums.asp.net/p/1266337/2380486.aspx

+0

Dim money = 1234.556789D DIM C =新しいGlobalization.CultureInfo(System.Globalization.CultureInfo.CurrentCulture.Name) c.NumberFormat.CurrencyDecimalDigits = 99 x.ToString( "C"、C)すべての非充填小数用 そしてIが後続取得ゼロ数字。これはあなたが示唆していたことですか、私が送ったリンクを誤解しましたか? – ckittel

1

のToString( "C20") - Cは精密サフィックスに

EDITを取る:おっと、どうやら質問を読んでいません。

.ToString(「C20」)。トリム(「0」)の修正のように思えるが、あなたはString.Formatのを使用しているとき、これは

+1

私は彼がただ関連する数字を表示したいと思うと思う。この*常に*は20桁です。 – Thorarin

+0

正解ですが、これは私にとってはうまくいかないでしょう。ソラリンは言った。 – ckittel

+0

.Trim( '0')は0.1Dを$ 0.10ではなく$ 0.1に変えます...私はこれも考えました。私はPadRight(n、 "0")でそれを連鎖することを考えました。 – ckittel

2

あなたはこのような何かを行うことができ...動作しません。 ...

フォーマット文字列を取得するには、以下の方法を使用して
var money = 1234.556789D; 
Console.WriteLine(money.ToString(GetFormat(money))); 

money = .1D; 

Console.WriteLine(money.ToString(GetFormat(money))); 

...

static string GetFormat(double input) 
{ 
    // get the number of decimal places to show 
    int length = input.ToString().Length - input.ToString().IndexOf(".") - 1; 

    // return the currency format string to use with decimal.ToString() 
    return string.Format("C{0}", length < 2 ? 2 : length); 
} 

あなたはさらに一歩それを取るしたい場合は、拡張メソッドにこのすべてを包むことができあなたは電話する必要はありませんでしたToString()の中からGetFormat()メソッドを呼び出すと、物事は少しきれいに見えるかもしれません。

+0

ええ、私はおそらく、ロールプレイングできることを明確にしておくべきでしょう。もし私がいつもen-US形式になるという仮定の下にいたら。私は他の文化も扱うために、もっと "焼き尽くされた"ものを期待していました。 ハードコードされた値をすべて現在のカルチャ固有の値に置き換えた場合、この方法または類似の方法は他のカルチャでも機能します。 – ckittel

0

正規表現を作成して、末尾の0をすべて取り除くことができます。