web-dev-qa-db-ja.com

末尾のゼロなしで小数を表示する最良の方法

丸めを行わずに、C#でこれらの文字列表現として小数を出力する表示フォーマッターはありますか?

// decimal -> string

20 -> 20
20.00 -> 20
20.5 -> 20.5
20.5000 -> 20.5
20.125 -> 20.125
20.12500 -> 20.125
0.000 -> 0

{0.#}は丸められ、一部のTrim型関数を使用しても、グリッド内のバインドされた数値列では機能しません。

94
JC.

表示する必要がある小数点以下の最大桁数はありますか? (あなたの例には最大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.#####"));
    }
135
Toby

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
30
Schmalls

この文字列形式は、「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
15
Erwin Mayer

これは私が上で見たもののさらに別のバリエーションです。私の場合、小数点の右側のすべての有効桁を保持する必要があります。つまり、最上位桁の後にすべてのゼロをドロップします。共有したほうがいいと思った。私はこれの効率を保証することはできませんが、美学を達成しようとするとき、あなたはすでにほとんど非効率に気をつけられています。

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セントを投入したかっただけです。

9
dyslexicanaboko

拡張方法:

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
4
jgauffin

dyslexicanaboko's answerに基づく別のソリューションですが、現在の文化には依存しません:

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);
}
3
David Dostal

箱から出して行うのは非常に簡単です:

_Decimal YourValue; //just as example   
String YourString = YourValue.ToString().TrimEnd('0','.');
_

これにより、Decimalからすべての末尾のゼロが削除されます。

行う必要があるのは、.ToString().TrimEnd('0','.');を10進変数に追加して、上記の例のように、末尾のゼロなしでDecimalStringに変換することだけです。

一部の地域では、.ToString().TrimEnd('0',',');である必要があります(ポイントの代わりにコンマを使用しますが、パラメーターとしてドットとコンマを追加することもできます)。

(両方をパラメーターとして追加することもできます)

2
Mervin

すぐに使用できるとは思いませんが、このような簡単な方法でそれを行う必要があります

public static string TrimDecimal(decimal value)
{
    string result = value.ToString(System.Globalization.CultureInfo.InvariantCulture);
    if (result.IndexOf('.') == -1)
        return result;

    return result.TrimEnd('0', '.');
}
1
Tim Skauge
decimal val = 0.000000000100m;
string result = val == 0 ? "0" : val.ToString().TrimEnd('0').TrimEnd('.');
0
Jerry Liang

私はこのバリアントになりました:

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);
    }

利点:

実行時に表示するポイントの後に有効数字の最大数を指定できます。

ラウンド方法を明示的に指定できます。

カルチャを明示的に制御できます。

0
lilo0

私は次のコードになりました:

    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;
    }
0
Arsen Zahray