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

C#Double-ToString()格式,带两位小数,但不舍入,c#,string,double,C#,String,Double,如何将C语言中的Double格式化为String,以便只有两位小数 如果我使用String.Format(“{0:0.00}%”,myDoubleValue)然后对数字进行四舍五入,我希望进行简单的截断,而不进行任何四舍五入。我还希望到字符串的转换对区域性敏感。我使用以下命令: double x = Math.Truncate(myDoubleValue * 100) / 100; string s = string.Format("{0:N2}%", x); // No fear of ro

如何将C语言中的
Double
格式化为
String
,以便只有两位小数

如果我使用
String.Format(“{0:0.00}%”,myDoubleValue)
然后对数字进行四舍五入,我希望进行简单的截断,而不进行任何四舍五入。我还希望到
字符串的转换对区域性敏感。

我使用以下命令:

double x = Math.Truncate(myDoubleValue * 100) / 100;
string s = string.Format("{0:N2}%", x); // No fear of rounding and takes the default number format
例如:

如果数字为50.947563,并且您使用以下选项,则会发生以下情况:

- Math.Truncate(50.947563 * 100) / 100;
- Math.Truncate(5094.7563) / 100;
- 5094 / 100
- 50.94
您的答案被截断了,现在要格式化字符串,只需执行以下操作:

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

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

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表示两位数的截断;在小数点后使用一个1加上尽可能多的零。使用您需要的区域性名称来调整格式结果。

您也可以自己编写,不过我想最终您必须想一种方法来执行实际的截断

NET Framework还支持自定义格式。这通常涉及到创建一个实现IFormatProvider和的格式化类。(msdn)

至少它很容易重复使用

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

这对我来说很有效

string prouctPrice = Convert.ToDecimal(String.Format("{0:0.00}", Convert.ToDecimal(yourString))).ToString();
由Kyle Rozendo表示的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);
}

由于
,下面的对数字进行四舍五入,但最多只能显示两位小数(删除任何尾随的零)


我知道这是一个旧线程,但我不得不这么做。虽然这里的其他方法可行,但我希望有一种简单的方法能够影响对
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;
    }
}
我使用
price.ToString(“0.00”)

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

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

以下内容仅可用于使用字符串属性的显示

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

添加一个要舍入然后丢弃的额外小数点怎么样:

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

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

为了显示货币的价值,您可以使用
“C”


输出:
$1.99

我遇到了Xamarin表单的问题,并通过以下方法解决了这个问题:

percent.ToString("0.##"+"%")
解决方案:

var d = 0.123345678; 
var stringD = d.ToString(); 
int indexOfP = stringD.IndexOf("."); 
var result = stringD.Remove((indexOfP+1)+2);
(indexOfP+1)+2(此数字取决于您要输入的数字数量 保留。我给它两个,因为问题所有者想要。)


还要注意系统的文化信息。这里是我的解决方案,没有四舍五入

在本例中,您只需将变量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);

-1您可以在格式化字符串的相同
string.Format
步骤中执行区域性敏感格式化。看看下面我的答案,太好了。我希望我的评论现在看起来没有那么愚蠢。:-)那么我将更改我的下一票。对我来说是这样的,因为字符串格式的解决方案非常简单,所以截断更为棘手。不幸的是,当数字小于1时,您的解决方案不起作用,举例说明:0.97,这种情况有什么解决办法吗?@Jonny这不起作用,因为它舍入-OP要截断它(而不是圆形)。差别很微妙。你说的“文化敏感”是什么意思?这是否意味着格式化的结果必须根据程序员提供的区域性值而有所不同?或者是否要使用当前线程的默认区域性?这不起作用。请尝试使用0.2415999。此解决方案会进行舍入,而不是截断。哇,如此多的向上投票,但它使用舍入。可能需要指向o但是取整正朝着要求的最接近的小数位前进,而截断则在要求的最接近的小数位之后停止。@mysticcoder我猜我的答案得到了如此多的赞成票,因为他们在谷歌搜索中遇到ops问题的方式与我相同,希望删除尾随的零,而不是寻找取整的d关于老年退休金计划的问题。我想我应该删除我的答案…@BrianOgden-不,请不要删除。我来这里是为了寻找你的答案。+1事实上,这种方法可以解决这一问题。有趣的是,一个不起作用的答案有60次投票(截至今天),而这个非常简单和防弹的解决方案只有一个…如果舍入影响截止点以上的一个以上数字,则此解决方案将不起作用。例如,0.199999将以0.20结束,而不是0.19。这将给出“123.46”。这个问题特别要求不要舍入。我认为您应该使用静态属性
Culture.InvariantCulture
而不是
new CultureInfo(“de de”)