回答:
表示する必要がある小数点以下の最大数はありますか?(あなたの例は最大5です)。
もしそうなら、私は "0。#####"でフォーマットするとあなたが望むことをするだろうと思います。
static void Main(string[] args)
{
var dList = new decimal[] { 20, 20.00m, 20.5m, 20.5000m, 20.125m, 20.12500m, 0.000m };
foreach (var d in dList)
Console.WriteLine(d.ToString("0.#####"));
}
"0.0#"
。
G
書式指定子を適切に使用する方法を学びました。MSDNドキュメントを参照してください。精度が指定されていない場合、10進数タイプの後続ゼロは保持されることを示す少し下のメモがあります。なぜ彼らがこれを行うのかはわかりませんが、精度に最大桁数を指定することで問題が解決するはずです。したがって、小数をフォーマットするにG29
は、最善の方法です。
decimal test = 20.5000m;
test.ToString("G"); // outputs 20.5000 like the documentation says it should
test.ToString("G29"); // outputs 20.5 which is exactly what we want
この文字列形式は、「0。#############################」のようになります。ただし、小数の有効桁数は最大で29桁であることに注意してください。
例:
? (1000000.00000000000050000000000m).ToString("0.#############################")
-> 1000000.0000000000005
? (1000000.00000000000050000000001m).ToString("0.#############################")
-> 1000000.0000000000005
? (1000000.0000000000005000000001m).ToString("0.#############################")
-> 1000000.0000000000005000000001
? (9223372036854775807.0000000001m).ToString("0.#############################")
-> 9223372036854775807
? (9223372036854775807.000000001m).ToString("0.#############################")
-> 9223372036854775807.000000001
これは、上で見たもののもう1つのバリエーションです。私の場合、小数点の右側のすべての有効数字を保持する必要があります。つまり、最上位の数字の後にすべてゼロをドロップします。共有したほうがいいと思いました。私はこれの効率を保証することはできませんが、美学を達成しようとするとき、あなたはすでに非効率にかなりのろわれています。
public static string ToTrimmedString(this decimal target)
{
string strValue = target.ToString(); //Get the stock string
//If there is a decimal point present
if (strValue.Contains("."))
{
//Remove all trailing zeros
strValue = strValue.TrimEnd('0');
//If all we are left with is a decimal point
if (strValue.EndsWith(".")) //then remove it
strValue = strValue.TrimEnd('.');
}
return strValue;
}
それだけです、私の2セントを投入したかっただけです。
strValue.TrimEnd('0').TrimEnd('.')
が、EndsWith
小切手ではなくなぜですか?
dyslexicanabokoの答えに基づくが、現在の文化に依存しない別の解決策:
public static string ToTrimmedString(this decimal num)
{
string str = num.ToString();
string decimalSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
if (str.Contains(decimalSeparator))
{
str = str.TrimEnd('0');
if(str.EndsWith(decimalSeparator))
{
str = str.RemoveFromEnd(1);
}
}
return str;
}
public static string RemoveFromEnd(this string str, int characterCount)
{
return str.Remove(str.Length - characterCount, characterCount);
}
拡張方法:
public static class Extensions
{
public static string TrimDouble(this string temp)
{
var value = temp.IndexOf('.') == -1 ? temp : temp.TrimEnd('.', '0');
return value == string.Empty ? "0" : value;
}
}
コード例:
double[] dvalues = {20, 20.00, 20.5, 20.5000, 20.125, 20.125000, 0.000};
foreach (var value in dvalues)
Console.WriteLine(string.Format("{0} --> {1}", value, value.ToString().TrimDouble()));
Console.WriteLine("==================");
string[] svalues = {"20", "20.00", "20.5", "20.5000", "20.125", "20.125000", "0.000"};
foreach (var value in svalues)
Console.WriteLine(string.Format("{0} --> {1}", value, value.TrimDouble()));
出力:
20 --> 20
20 --> 20
20,5 --> 20,5
20,5 --> 20,5
20,125 --> 20,125
20,125 --> 20,125
0 --> 0
==================
20 --> 20
20.00 --> 2
20.5 --> 20.5
20.5000 --> 20.5
20.125 --> 20.125
20.125000 --> 20.125
0.000 --> 0
IndexOf
、文字列内の文字を検索するために使用する方法を示しています。小数なしで問題を解決するために例を調整するのは非常に簡単です。
箱から出すのはとても簡単です:
Decimal YourValue; //just as example
String YourString = YourValue.ToString().TrimEnd('0','.');
これにより、小数点からすべての後続ゼロが削除されます。
上記の例のよう.ToString().TrimEnd('0','.');
に、10進変数に追加して、後続ゼロなしでa Decimal
をa に変換する必要がありますString
。
一部の地域では、それは.ToString().TrimEnd('0',',');
(ポイントの代わりにコンマを使用しますが、確実にパラメーターとしてドットとコンマを追加することもできます)でなければなりません。
(両方をパラメーターとして追加することもできます)
params
引数を扱う場合、明示的に配列を作成する必要はありません。したがって、詳細の代わりに、TrimEnd("0".ToCharArray())
次のように書くことができますTrimEnd('0')
(注:のchar
代わりに単一を渡すchar[]
)。
char
ではなくを渡す必要があります(つまりstring
、二重引用符ではなく単一引用符です)。私はあなたのためにそれを修正しました-うまくいけばあなたは気にしないでしょう。
私は次のコードで終わりました:
public static string DropTrailingZeros(string test)
{
if (test.Contains(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator))
{
test = test.TrimEnd('0');
}
if (test.EndsWith(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator))
{
test = test.Substring(0,
test.Length - CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator.Length);
}
return test;
}
私はこの亜種に終わりました:
public static string Decimal2StringCompact(decimal value, int maxDigits)
{
if (maxDigits < 0) maxDigits = 0;
else if (maxDigits > 28) maxDigits = 28;
return Math.Round(value, maxDigits, MidpointRounding.ToEven).ToString("0.############################", CultureInfo.InvariantCulture);
}
利点:
実行時に表示するポイントの後の最大有効桁数を指定できます。
丸め方法を明示的に指定できます。
文化を明示的に制御できます。
私は自分のプロジェクトの1つに合うように自分で以下の拡張メソッドを作成しましたが、おそらく他の人に役立つでしょう。
using System.Numerics;
using System.Text.RegularExpressions;
internal static class ExtensionMethod
{
internal static string TrimDecimal(this BigInteger obj) => obj.ToString().TrimDecimal();
internal static string TrimDecimal(this decimal obj) => new BigInteger(obj).ToString().TrimDecimal();
internal static string TrimDecimal(this double obj) => new BigInteger(obj).ToString().TrimDecimal();
internal static string TrimDecimal(this float obj) => new BigInteger(obj).ToString().TrimDecimal();
internal static string TrimDecimal(this string obj)
{
if (string.IsNullOrWhiteSpace(obj) || !Regex.IsMatch(obj, @"^(\d+([.]\d*)?|[.]\d*)$")) return string.Empty;
Regex regex = new Regex("^[0]*(?<pre>([0-9]+)?)(?<post>([.][0-9]*)?)$");
MatchEvaluator matchEvaluator = m => string.Concat(m.Groups["pre"].Length > 0 ? m.Groups["pre"].Value : "0", m.Groups["post"].Value.TrimEnd(new[] { '.', '0' }));
return regex.Replace(obj, matchEvaluator);
}
}
ただし、への参照が必要になりますSystem.Numerics
。