C#Double-小数点以下2桁で、丸めなしのToString()フォーマット


153

小数点以下2桁だけになるようにC#でa Doubleをa にフォーマットするにはどうすればよいStringですか?

私が使用String.Format("{0:0.00}%", myDoubleValue)する場合、数値は丸められ、丸めのない単純な切り捨てが必要です。また、コンバージョンをString文化に敏感にしたいと考えています。


「カルチャーセンシティブ」とはどういう意味ですか?それは、プログラマーが提供するカルチャの値に応じて、フォーマットの結果が異なる必要があることを意味しますか?または、現在のスレッドのデフォルトのカルチャを使用しますか?
CesarGon、2010年

回答:


204

私は以下を使用します:

double x = Math.Truncate(myDoubleValue * 100) / 100;

例えば:

数が50.947563で、次を使用すると、次のようになります。

- Math.Truncate(50.947563 * 100) / 100;
- Math.Truncate(5094.7563) / 100;
- 5094 / 100
- 50.94

そして、あなたの答えは切り捨てられています、今文字列をフォーマットするには、単に次のようにします:

string s = string.Format("{0:N2}%", x); // No fear of rounding and takes the default number format

3
-1 string.Format文字列をフォーマットするのと同じ手順で、カルチャに依存したフォーマットを実行できます。以下の私の答えを参照してください。
CesarGonは

1
それは素晴らしいことです。私のコメントが今のばかげて見えないことを願っています。:-)その後、私は自分の反対票を変更します。
CesarGon、

1
私にとってはそうでした。文字列フォーマットのソリューションは信じられないほど単純なので、切り捨てはよりトリッキーでした。
Kyle Rosendo、2010年

1
残念ながら、数値が1未満の場合、ソリューションは機能しません:0.97、この状況に回避策はありますか?
Ali Dehghan、2014年

2
@Jonnyは丸められるため機能しません-OPは丸められずに切り捨てられます。違いは微妙です。
BKSpurgeon

102

次の例は、数値を丸めていますが、のおかげで小数点以下2桁までしか表示されていません(後続のゼロは削除されています).##

decimal d0 = 24.154m;
decimal d1 = 24.155m;
decimal d2 = 24.1m;
decimal d3 = 24.0m;

d0.ToString("0.##");   //24.15
d1.ToString("0.##");   //24.16 (rounded up)
d2.ToString("0.##");   //24.1  
d3.ToString("0.##");   //24

http://dobrzanski.net/2009/05/14/c-decimaltostring-and-how-to-get-rid-of-trailing-zeros/


12
これは機能しません。0.2415999で試してください。このソリューションは切り捨てではなく丸めます。
BJury

5
うわー、非常に多くの賛成投票ですが、それでも丸めを使用しています。切り捨ては要求された最も近い小数点以下の桁数が切り捨てられるのに対し、丸めは要求された最も近い小数点以下の桁に向かっていることを指摘する必要があるかもしれません。
mysticcoder

1
@mysticcoder私の答えは非常に多くの賛成票を獲得していると思います。なぜなら、Google検索でopsの質問に来るのは、私が行ったのと同じ方法で、末尾のゼロを削除し、opsの質問の丸めの欲求を探すのではないからです。私は自分の答えを削除する必要があると思います...
ブライアンオグデン

@BrianOgden-いいえ、削除しないでください。私はあなたの答えを探してここに到着しました。+1
ロベルト

35

最初に切り捨ててからフォーマットすることをお勧めします:

double a = 123.4567;
double aTruncated = Math.Truncate(a * 100) / 100;
CultureInfo ci = new CultureInfo("de-DE");
string s = string.Format(ci, "{0:0.00}%", aTruncated);

2桁の切り捨てには定数100を使用します。1に続けて、必要な小数点以下の桁と同じ数のゼロを使用します。フォーマット結果を調整するために必要なカルチャ名を使用します。


の代わりにnew CultureInfo("de-DE")、静的プロパティを使用する必要があると思いますCulture.InvariantCulture
vchan


13

price.ToString("0.00") 先頭の0を取得するために使用します


6

カイル・ロゼンドによって表現されたc#関数:

string DecimalPlaceNoRounding(double d, int decimalPlaces = 2)
{
    d = d * Math.Pow(10, decimalPlaces);
    d = Math.Truncate(d);
    d = d / Math.Pow(10, decimalPlaces);
    return string.Format("{0:N" + Math.Abs(decimalPlaces) + "}", d);
}

5

四捨五入して破棄する小数を1つ追加します。

var d = 0.241534545765;
var result1 = d.ToString("0.###%");

var result2 = result1.Remove(result1.Length - 1);

3
(今日の時点で)機能していない回答の投票数が60になるのはおかしいです。このかなりシンプルで防弾ソリューションには1つしかありません
。–

5
これは、丸めがカットオフより上の1桁以上に影響する場合には機能しません。たとえば、0.199999は、このコードでは0.19ではなく、0.20になります。
ベルネム2018年

4

これは私のために働いています

string prouctPrice = Convert.ToDecimal(String.Format("{0:0.00}", Convert.ToDecimal(yourString))).ToString();

2

これは古いスレッドであることは知っていますが、これを実行する必要がありました。ここでの他のアプローチは機能しますが、への多くの呼び出しに影響を与えることができる簡単な方法が必要でしたstring.format。したがって、Math.Truncateへのすべての呼び出しにを追加することは、実際には適切なオプションではありませんでした。また、フォーマットの一部がデータベースに保存されているため、さらに悪化しました。

したがって、フォーマット文字列に切り捨てを追加できるカスタム形式プロバイダーを作成しました。例:

string.format(new FormatProvider(), "{0:T}", 1.1299); // 1.12
string.format(new FormatProvider(), "{0:T(3)", 1.12399); // 1.123
string.format(new FormatProvider(), "{0:T(1)0,000.0", 1000.9999); // 1,000.9

実装は非常にシンプルで、他の要件に簡単に拡張できます。

public class FormatProvider : IFormatProvider, ICustomFormatter
{
    public object GetFormat(Type formatType)
    {
        if (formatType == typeof (ICustomFormatter))
        {
            return this;
        }
        return null;
    }

    public string Format(string format, object arg, IFormatProvider formatProvider)
    {
        if (arg == null || arg.GetType() != typeof (double))
        {
            try
            {
                return HandleOtherFormats(format, arg);
            }
            catch (FormatException e)
            {
                throw new FormatException(string.Format("The format of '{0}' is invalid.", format));
            }
        }

        if (format.StartsWith("T"))
        {
            int dp = 2;
            int idx = 1;
            if (format.Length > 1)
            {
                if (format[1] == '(')
                {
                    int closeIdx = format.IndexOf(')');
                    if (closeIdx > 0)
                    {
                        if (int.TryParse(format.Substring(2, closeIdx - 2), out dp))
                        {
                            idx = closeIdx + 1;
                        }
                    }
                    else
                    {
                        throw new FormatException(string.Format("The format of '{0}' is invalid.", format));
                    }
                }
            }
            double mult = Math.Pow(10, dp);
            arg = Math.Truncate((double)arg * mult) / mult;
            format = format.Substring(idx);
        }

        try
        {
            return HandleOtherFormats(format, arg);
        }
        catch (FormatException e)
        {
            throw new FormatException(string.Format("The format of '{0}' is invalid.", format));
        }
    }

    private string HandleOtherFormats(string format, object arg)
    {
        if (arg is IFormattable)
        {
            return ((IFormattable) arg).ToString(format, CultureInfo.CurrentCulture);
        }
        return arg != null ? arg.ToString() : String.Empty;
    }
}


1

何が価値があるのか​​、通貨を示すために、あなたは使うことができます"C"

double cost = 1.99;
m_CostText.text = cost.ToString("C"); /*C: format as currentcy */

出力: $1.99


0

独自のIFormatProviderを記述することもできますが、最終的には実際の切り捨てを行う方法を考える必要があると思います。

.NET Frameworkは、カスタムフォーマットもサポートしています。これには通常、IFormatProviderとICustomFormatterの両方を実装するフォーマットクラスの作成が含まれます。(msdn)

少なくとも、簡単に再利用できます。

独自のIFormatProvider / ICustomFormatterを実装する方法についての記事は、こちらのCodeProjectにあります。この場合、既存の数値フォーマットを「拡張」するのが最善の策かもしれません。難しく見えません。


0

以下は、Stringのプロパティを使用する表示のみに使用できます。

double value = 123.456789;
String.Format("{0:0.00}", value);

これにより、「123.46」が得られます。質問は特に丸めを要求しません。
Tobberoth、

0

解決:

var d = 0.123345678; 
var stringD = d.ToString(); 
int indexOfP = stringD.IndexOf("."); 
var result = stringD.Remove((indexOfP+1)+2);

(indexOfP + 1)+2(この数は、保持する数の数によって異なります。質問の所有者が望んでいるため、2つ指定します。)


0

また、システムのCultureInformationにも注意してください。ここで丸めなしの私の解決策。

この例では、変数MyValueをdoubleとして定義する必要があります。結果として、文字列変数NewValueでフォーマットされた値を取得します

注-C#のusingステートメントも設定します。

using System.Globalization;  

string MyFormat = "0";
if (MyValue.ToString (CultureInfo.InvariantCulture).Contains (CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator))
   {
      MyFormat += ".00";
   }

string NewValue = MyValue.ToString(MyFormat);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.