C#Double - ToString()格式,带有两个小数位但没有舍入

时间:2010-03-16 11:40:21

标签: c# string double

如何在C#中将Double格式化为String,以便只有两位小数?

如果我使用String.Format("{0:0.00}%", myDoubleValue),则数字会被舍入,我想要一个没有任何舍入的简单截断。我还希望转换为String对文化敏感。

15 个答案:

答案 0 :(得分:183)

我使用以下内容:

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

答案 1 :(得分:88)

以下轮次数字,但只显示最多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/

答案 2 :(得分:32)

我建议先截断,然后格式化:

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

使用常数100表示​​2位数截断;在您想要的小数点后使用1后跟尽可能多的零。使用您需要的文化名称来调整格式化结果。

答案 3 :(得分:16)

最简单的方法,使用数字格式字符串:

double total = "43.257"
MessageBox.Show(total.ToString("F"));

答案 4 :(得分:9)

我使用price.ToString("0.00") 获得领先的0

答案 5 :(得分:5)

这对我有用

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

答案 6 :(得分:5)

c#函数,由Kyle Rozendo表示:

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

答案 7 :(得分:4)

如何添加一个额外的十进制数,然后将其舍弃然后丢弃:

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

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

答案 8 :(得分: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;
    }
}

答案 9 :(得分:1)

以下内容仅可用于显示使用String ..

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

答案 10 :(得分:1)

为了显示货币,您可以使用"C"

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

输出:$1.99

答案 11 :(得分:0)

您也可以编写自己的IFormatProvider,但我想最终您必须考虑实际截断的方法。

  

.NET Framework还支持自定义格式。这通常涉及创建实现IFormatProvider和ICustomFormatter的格式化类。 (MSDN)

至少它很容易重复使用。

有一篇关于如何实现自己的IFormatProvider / ICustomFormatter here at CodeProject的文章。在这种情况下,“扩展”现有的数字格式可能是最好的选择。看起来并不太难。

答案 12 :(得分:0)

我在使用xamarin时遇到了问题,并通过以下方式解决了问题:

porcent.ToString("0.##"+"%")

答案 13 :(得分:0)

解决方案:

#include <iostream>
using namespace std;

int main()
{
int x = 0, ind = 2, prod;

cout << " Hey! What's the initial value of your variable ? ";
cin >> x;

while (x < 100)
{   
    prod = x * ind;             
    cout << prod;
}

return 0;
}
  

(indexOfP + 1)+2(此数字取决于您要多少个数字   保留。我给它两个是因为问题所有者想要的。)

答案 14 :(得分: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);