文字列を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
参考のために、これと本質的に重複している他の質問を以下に示します。ここで与えられた回答のおかげで私は見つけました:
ToString()
を General( "G")Format Specifier とともに使用して、目的の結果を得ることができます。 。精度を指定してこのフォーマット文字列を使用すると、末尾のゼロは切り捨てられます。どのような状況でも丸めを防ぐために、精度を小数に許可される最大値(29)に設定する必要があります。
必要なものを生成するコード行はnumber.ToString("G29")
です。number
は元の10進数です。
0.0001より小さい数値は科学表記法に変換されることに注意してください。このフォーマッタの機能の詳細については、上記の参照リンクをご覧ください。
string s = d.ToString("0.#############################");
これらは必ずしも無意味ではありません-計算中の精度を示します。小数は正規化されるのではなく、精度レベルを維持します。
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個の#文字が機能しますが、それは非常にいでしょう...
どうですか:
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);
}
次のように format string を指定できます。
String.Format("{0:0.000}", x);
誰もが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
すでにかなりの回答があります。私はよくこのチートシートを参照します: http://blog.stevex.net/string-formatting-in-csharp/
ややハックですが、これは動作するはずです:
decimal a = 100.00M;
string strNumber = string.Format("{0}", a);
Console.WriteLine(strNumber.Contains('.') ? strNumber.TrimEnd('0').TrimEnd('.') : strNumber);
String.Format("{0:0.##}", 123.0); // "123"
私はあなたがしたいことを信じています:
var s = String.Format("{0:#####.###}");