13

コンマを千の区切り記号として使用して、小数を文字列に変換し、小数が作成されたのと同じ精度を維持したいと思います。(有効数字は 2 ~ 5 桁になります)

        decimal d = 1234.4500M;

        //I'd like "1,234.4500"

        var notRight = d.ToString("###,###.#######");     //1,234.45
        var alsoNotRight = d.ToString("###,###.00000");;  //1,234.45000
        var notRightEither = d.ToString("N");    //1,234.45
        var notRightEither2 = d.ToString("G");   //1234.45000

文字列を手動で解析せずにこれを行う組み込みの方法はありませんか? 単一のフォーマット文字列がない場合、これを行う最も簡単な方法は何ですか?

4

2 に答える 2

13

ドキュメントによると、10 進数は末尾のゼロを保持します。「G」指定子を使用するか、指定子をまったく使用しない場合は、それらを表示できます。桁区切り記号を含む指定子のいずれかを使用すると、それらは失われます。

文字列に変換するときに末尾のゼロの数を指定する場合は、次のように書式文字の後に精度指定子(0 ~ 99 桁) を追加することで実行できます。

decimal d=1234.45M;
var numberAsString=d.ToString("N4");

結果は次のようになります。

 1,234.4500

更新:数値のバイナリ表現を返すDecimal.GetBitsメソッドを 使用して、10 進数の桁数を取得できます。小数点以下の桁数は、4 番目の要素のビット 16 ~ 23 (3 番目のバイト) に格納されます。

The fourth element of the returned array contains the scale factor and sign. It consists of the following parts:

...

Bits 16 to 23 must contain an exponent between 0 and 28, which indicates the power of 10 to divide the integer number.

すべての数字を使用して文字列表現を取得するには、次のようにします。

decimal d=1234.45000M;
var nums=Decimal.GetBits(d);
var decimals=BitConverter.GetBytes(nums[3])[2];
var formatStr="N"+decimals;
d.ToString(formatStr);

生成する

1,234.45000
于 2012-06-14T16:57:33.337 に答える
1

小数点以下の桁数を可変にすることを計画しているので(2-5) 、文字列形式でそれを引き出すことはできないと思います。

このソリューションは必ずしもきれいではありませんが、仕事は完了します。プロセスで複数の文字列が割り当てられることに注意してください (5 つだと思います)。そのため、大規模な使用ではうまく機能しない可能性があります。小数点以下の桁数を保持し、小数点の前の部分でカンマ区切りのグループを取得します。

public static string FormatDecimal(decimal d)
{
    return d.ToString("N0") + // Format portion before decimal
           "." + 
           d.ToString().Split('.')[1];  // Retain number of decimal places
}
于 2012-06-14T17:18:48.733 に答える