web-dev-qa-db-ja.com

C#10進数をフォーマットして、余分な0を削除するにはどうすればよいですか?

文字列を10進数としてフォーマットしたいのですが、10進数には10進数の後にゼロが続きます。それらの無意味な0が消えるようにフォーマットするにはどうすればよいですか?

string.Format("{0}", 1100M);
string.Format("{0}", 1100.1M);
string.Format("{0}", 1100.100M);
string.Format("{0}", 1100.1000M);

ディスプレイ:

1100
1100.1
1100.100
1100.1000

しかし、私はそれが欲しいです:

1100
1100.1
1100.1
1100.1

参考のために、これと本質的に重複している他の質問を以下に示します。ここで与えられた回答のおかげで私は見つけました:

46
Scott Stafford

ToString()General( "G")Format Specifier とともに使用して、目的の結果を得ることができます。 。精度を指定してこのフォーマット文字列を使用すると、末尾のゼロは切り捨てられます。どのような状況でも丸めを防ぐために、精度を小数に許可される最大値(29)に設定する必要があります。

必要なものを生成するコード行はnumber.ToString("G29")です。numberは元の10進数です。

0.0001より小さい数値は科学表記法に変換されることに注意してください。このフォーマッタの機能の詳細については、上記の参照リンクをご覧ください。

80
Herohtar
string s = d.ToString("0.#############################");
21
Jason dinAlt

これらは必ずしも無意味ではありません-計算中の精度を示します。小数は正規化されるのではなく、精度レベルを維持します。

this answer にいくつかのコードがあり、正規化された値を返します-それを使用して、結果をフォーマットできます。例えば:

using System;
using System.Numerics;

class Test
{
    static void Display(decimal d)
    {
        d = d.Normalize(); // Using extension method from other post
        Console.WriteLine(d);
    }

    static void Main(string[] args)
    {
        Display(123.4567890000m); // Prints 123.456789
        Display(123.100m);        // Prints 123.1
        Display(123.000m);        // Prints 123
        Display(123.4567891234m); // Prints 123.4567891234
    }
}

Isuspectほとんどのフォーマット文字列アプローチは失敗します。 「0」のフォーマット文字列だと思います。そして、28個の#文字が機能しますが、それは非常にいでしょう...

4
Jon Skeet

どうですか:

string FormatDecimal(decimal d)
{
    const char point = System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator[0];
    string s = d.ToString();
    // if there's no decimal point, there's nothing to trim
    if (!s.Contains(point) == -1)
        return s;
    // trim any trailing 0s, followed by the decimal point if necessary
    return s.TrimEnd('0').TrimEnd(point);
}
3
Gabe

次のように format string を指定できます。

String.Format("{0:0.000}", x);
3
driis

誰もがG書式指定子を使用することを提案するものとは異なり、余分な末尾のゼロを削除しながら、千の区切り文字と小数点の両方を保持するために以下を提案します。

{0:#,#.##}

ほとんどの場合、この形式の結果はGよりもはるかに優れています。

String.Format("{0:#,#.##}",25/2.4);
10.42

String.Format("{0:#,#.##}",1000000);
1,000,000

String.Format("{0:#,#.##}",1000000.3600000);
1,000,000.36

そして、G指定子は、考えられるすべての組み合わせを実際に処理することはできません。

String.Format("{0:G29}",25/2.4);
10.416666666666668

String.Format("{0:G2}",25/2.4);
10

String.Format("{0:G29}",1000000.3600000);
1000000.36

String.Format("{0:G2}",1000000.3600000);
1E+06
3
Mohsen Afshin

すでにかなりの回答があります。私はよくこのチートシートを参照します: http://blog.stevex.net/string-formatting-in-csharp/

2
Baz Hughes

ややハックですが、これは動作するはずです:

decimal a = 100.00M;
string strNumber = string.Format("{0}", a);
Console.WriteLine(strNumber.Contains('.') ? strNumber.TrimEnd('0').TrimEnd('.') : strNumber);
2
Davy8
String.Format("{0:0.##}", 123.0); // "123"
1
John K.

私はあなたがしたいことを信じています:

var s = String.Format("{0:#####.###}");
1
AlG